2016-06-02 9 views
2

私はPython(2.7、3.4)でボットを開発しています。私は、ボットコマンドに基づいて使用される約30以上の動的関数を定義しました。1つの機能に複数の名前を付けることはできますか?

def c_about(): 
    return 
def c_events(): 
    return 
def c_currentlocation(): 
    return 

など多くのダミー機能:開発しながらでないすべての機能が行われているので、私はこのような(私は定義していない場合は、コードが実行されません)彼らのために、空の関数を定義する必要があります。

質問:
それは同じ機能を定義するためにPythonで何とか可能ですが、複数の名前を持ちますか?
このような何か:

def c_about(), c_events(), c_currentlocation(): 
    return 
+1

を代わりに使用すると、目的球マッピング辞書を定義することができる: '= { '約' CMDを:c_about、...} '。これにより、コマンドと関数の名前を切り離し、クラスやパッケージに対して関数を編成し、 'cmd'get( 'mycommand'、dummy_function)'のような関数を呼び出すことができます。 –

答えて

2

機能は、インターンを(すなわち、自動的に同じ不変オブジェクトへのmultiple referencesを共有する)はありませんが、同じ名前を共有することができます

>>> def a(): pass 
... 
>>> a 
<function a at 0x101c892a8> 
>>> def b(): pass 
... 
>>> b 
<function b at 0x101c89320> 
>>> c=a 
>>> c 
<function a at 0x101c892a8> # note the physical address is the same as 'a' 

だから、明確にあなたが行うことができます:

トンのために彼はまだ定義されていない関数の場合、あなたはNameErrorいずれかのキャッチでtry/catchブロックを使用することができます。

def default(): 
    print "default called" 

try: 
    not_defined() 
except NameError: 
    default() 

かのfuncsの辞書を使用してKeyErrorをキャッチする:

あなたが行うことができます
funcs={"default": default} 

try: 
    funcs['not_defined']() 
except KeyError: 
    funcs['default']()  

あるいは、 funcsのdictでその構文を好む場合はfuncs.get(not_defined, default)()です。

3

定義された関数は、他のすべてのような変数に格納されているので、はい、それは完全に可能です。

def foo(): 
    pass 

baz = bar = foo 

はまだ元の関数(help(bar)まだfooに言及します)に関連するいくつかのメタデータがありますが、それは機能には影響しません。

別のオプションは、ワンライナーのためlambda Sを使用することです:

foo = bar = baz = lambda: None 
1

はい、可能ですし、ループを使用してリストに格納することも可能です。

l = [] 
for i in range(10): 
    l.append(lambda: None) 

そして、あなたは、例えば、l[index]()

ような指標を介してそれらのいずれかを参照することができる:例えば

c_events = 0 
c_about = 1 
l[c_events]() 
関連する問題