0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

If文いらず!Pythonで値や処理を自動で切り替える軽量ライブラリ

Last updated at Posted at 2025-07-11

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?