Getattrを使用して、変数に応じてさまざまな関数を呼び出しています。
私はそのようなことをしています:
getattr(foo, bar) ()
それは機能し、foo.bar()のような関数を呼び出します
私の問題は、「bar」関数があり、それを異なるパラメーターで呼び出したいということです。例えば:
def f1() :
pass
def f2(param1) :
pass
def f3(param1,param2) :
pass
したがって、「bar」はf1、f2、またはf3になります。
私はこれを試しました:paramsが「bar」関数に必要なすべてのパラメータを含むリストであると仮定します
getattr(foo, bar) (for p in params :)
Params変数の長さを監視する必要がない「クリーンな」ソリューションを監視しています
次のようなことを試すことができます:
getattr(foo, bar)(*params)
これは、params
がリストまたはタプルの場合に機能します。 params
の要素は次の順序で解凍されます。
params=(1, 2)
foo(*params)
と同等です:
params=(1, 2)
foo(params[0], params[1])
キーワード引数がある場合は、それも実行できます。
getattr(foo, bar)(*params, **keyword_params)
どこ keyword_params
は辞書です。
また、この回答は実際にはgetattr
から独立しています。それはどんな関数/メソッドでも機能します。
これはPython 3で非常に簡単です。例は次のとおりです。
class C:
def __init__(self, name, age):
self.name = name
self.age = age
def m(self, x):
print(f"{self.name} called with param '{x}'")
return
ci = C("Joe", 10)
print(C)
print(ci)
print(C.m)
print(ci.m)
print(getattr(ci,'m'))
getattr(ci,'m')('arg')
<class '__main__.C'>
<__main__.C object at 0x000001AF4025FF28>
<function C.m at 0x000001AF40272598>
<bound method C.m of <__main__.C object at 0x000001AF4025FF28>>
<bound method C.m of <__main__.C object at 0x000001AF4025FF28>>
Joe called with param 'arg'
getattr は builtins モジュールからのものであり、この場合、クラスインスタンスci
と関数の名前を表す文字列の2つのパラメーターを受け取ることに注意してください。
パラメータのデフォルト値を定義することもできます。
def m(self, x=None):
print(f"{self.name} caled with param '{x}'")
return
その場合、次のように呼びます。
getattr(ci,'m')()