7月6日に初めての、Pythonライブラリtriggon
をリリースしました。
5日経ってすでに、PypIでのインストール数が500を超えました!
開発期間は約1か月で、初めて扱う処理も多かったため、学びながら開発しました。
このライブラリの目的は、if文やフラグ引数を減らし、コードの分岐処理をシンプルにすることです。
現在はベータ版(バージョン 0.1.b2
)として公開中です。
外部ライブラリを一切使っていないため、ファイルサイズはたったの20.3 KBです!
インストール方法はこちら:
pip install triggon
この記事では、簡単にtriggon
の紹介をします!
triggonができること
このライブラリはラベルを使い、そのラベルに紐づく値や処理自体を切り替えることができます。
トリガーポイントを設定し、その地点を通過すると切り替わります。
一時的な切り替えや、複雑な分岐がある場合に有効です!
主な特徴
- リテラル値や変数の値を自動で変更
- 早期リターンや関数実行の切り替えを制御
- 早期リターンで設定した値を一緒に返す
使い方(サンプルコード)
ここでは3つのサンプルコードを紹介します。
➀ リテラル値を切り替える
特定の関数を通過した場合のみ、値を切り替えその後また元の値に切り替えます。
from triggon import Triggon
tg = Triggon("msg", new="初めまして") # 変更後のテキストを、ラベルと一緒に設定
def init_config():
# ...省略
tg.set_trigger("msg") # 'msg'にトリガーポイントを設定
greet()
def greet():
x = tg.alter_literal("msg", org="こんにちは") # 元の値にラベルを設定します
print(x)
# 値が切り替わってた場合、元の値に戻す
# disable=Trueは永続的に、
# そのラベルのトリガーポイントによる切り替えを無効にする(デフォルトFalse)
tg.revert("msg", disable=True)
# 1回目
greet()
# 2回目
init_config()
# 3回目
greet()
# 出力結果(1回目)
こんにちは
# 出力結果(2回目)
初めまして
# 出力結果(3回目)
こんにちは
revert(disable=False)
の場合、次のトリガーポイントを通るまで元の値に切り替わります。
➁ クラス変数の値を切り替える
この例では、3つのクラス変数のフラグ値を切り替えます。
from dataclasses import dataclass
from triggon import Triggon
# 複数の値を設定したい場合は配列を使う
# インデックス0にTrue、インデックス1にFalseを設定
tg = Triggon("flag", [True, False])
@dataclass
class Sample:
flag_a: bool = None
flag_b: bool = None
flag_c: bool = None
def sample(self):
# 変更対象の変数を登録する
# 先頭のアスタリスクの数でインデックス表記
tg.alter_var({
"flag": [self.flag_a, self.flag_b], # インデックス0の値に切り替え(True)
"*flag": self.flag_c, # インデックス1の値に切り替え(False)
})
print(
f"flag_a: {self.flag_a}\n"
f"flag_b: {self.flag_b}\n"
f"flag_c: {self.flag_c}\n"
)
samp = Sample()
# 1回目
samp.sample()
tg.set_trigger("flag") # 'flag'のトリガーポイントを設定
# 2回目
samp.sample()
# 出力結果(1回目)
flag_a: None
flag_b: None
flag_c: None
# 出力結果(2回目)
flag_a: True
flag_b: True
flag_c: False
辞書型の際は、キーワード引数であるindex
が使えないため、代わりに*
を使用してインデックスを表しています。
tg.alter("flag", self.flag_a, index=0)
tg.alter("flag", self.flag_b, index=0)
tg.alter("flag", self.flag_c, index=1)
のように分けて書くことも可能です。
➂ 早期リターン + 任意の関数実行
この例では、早期リターンと関数を両方使っています。
from triggon import Triggon, TrigFunc
tg = Triggon({
"call": None, # 関数呼び出しは、その関数の値を返すので`None`で固定
"return": "早期リターンで終了!", # 早期リターンで一緒に返す値を設定、ない場合は`None`を設定
})
F = TrigFunc() # 対象関数に使うクラスインスタンス変数を作成
def func_a() -> int:
print("トリガーポイントを通過するとfunc_b()が発動します。")
tg.trigger_func("call", F.func_b()) # 'call'トリガーオンで関数呼び出し
# 'return'トリガーオンで早期リターン
# `do_print=True`で設定値を出力する`(デフォルトFalse)
tg.trigger_return("return", do_print=True)
print("通常終了!")
def func_b():
print("func_b()に到達!")
# 1回目
func_a()
tg.set_trigger(["call", "return"]) # 'call'と'return'のトリガーポイントを設定
# 2回目
tg.exit_point("return", F.func_a()) # 早期リターンで抜けるポイントを設定
# 出力結果(1回目)
トリガーポイントを通過するとfunc_b()が発動します。
通常終了!
# 出力結果(2回目)
トリガーポイントを通過するとfunc_b()が発動します。
func_b()に到達!
早期リターンで終了!
以上、3つのサンプルコードを紹介しました。
↓ 各関数の説明や、サンプルコードはREADMEで見られます
https://github.com/tsuruko12/triggon/blob/jp/README.md
現在ベータ版なので、定期的にバグの修正や機能のアップデートを行っています!
不具合や機能の提案なども歓迎しています!
GitHubではソースコードも公開しています、気になる方がいれば見てみてください。
🔗 GitHub -> https://github.com/tsuruko12/triggon/tree/jp
🔗 X -> https://x.com/12tsuruko