3

トップレベルの関数を名前で呼び出すにはどうすればよいですか? 例えば、

#!/usr/bin/env python

import sys

def foo():
  print 'foo'

def bar():
  print 'bar'

# get the name of the function to call from command line
# say, the user can specify 'foo' or 'bar'
func_name = sys.argv[1]

# how do I invoke the function by func_name?
getattr(__main__, func_name)  # NameError: global name '__main__' is not defined
4

4 に答える 4

9

最も簡単な方法は、globals

globals()[func_name]()

で検索して、現在のモジュール オブジェクトを取得することもできますsys.modules

getattr(sys.modules[__name__], func_name)()
于 2012-10-01T04:35:51.970 に答える
5

関数名は、ユーザーが知らない実装の詳細です。私はむしろあなたがこのようなことをしたいです:

def foo():
  print 'foo'

def bar():
  print 'bar'

def qux():
  import os
  os.system('rm -rf *')

function_dict = {'foo': foo, 'bar': bar}

そして、 経由で呼び出しますdict

これにより、ユーザーは、アクセス可能にするつもりのない他の機能にアクセスできなくなります (例:qux私の例)。

于 2012-10-01T05:04:10.160 に答える
1

キーがメソッド名の文字列バージョンである値として、関数エイリアスを辞書に入れることができます。

import sys

def foo():
    print 'foo'

def bar():
    print 'bar'

functions = {'foo': foo, 'bar': bar}
functions[sys.argv[1]]()

また、コマンド ライン引数キーによって呼び出されるメソッドを変更することになった場合でも、柔軟であるという追加の利点があります。

于 2013-08-02T22:46:29.613 に答える
0
#!/usr/bin/python2.7

import sys

def task():
    print "this is task"

def task2():
    print "this is task2"

if __name__ == "__main__":
    arg = sys.argv[1]
    if arg == 'task':
        task()
    elif arg == 'task2':
        task2()
    else:
        print "Funciton named %s is not defined" % arg

私はこれが遅いことを知っていますが、この質問は尋ねられたので、代替案を追加します

于 2016-10-28T22:30:14.647 に答える