1

入力文字列が有効な関数名かどうかを判断したい。isfunction call に渡される前に変数の値を置き換える方法はありますか?

#!/usr/bin/python
def testFunc():
    print "Hello world!";
    return;

myString = "testFunc";
isfunction(testFunc); // This returns **True**
isfunction(myString); // This returns **False**
4

2 に答える 2

1

ロードされた関数が存在するかどうかを確認したい場合、これを試すことができます:

try:
    if hasattr(myString, '__call__'):
        func = myString
    elif myString in dir(__builtins__):
        func = eval(myString)
    else:
        func = globals()[myString]

except KeyError:
    #this is the fail condition

# you can use func()

ifmyString が実際には関数オブジェクトではなく文字列であることを常に保証する場合、最初のものは実際には不要です。安全のために追加しました。

いずれにせよ、これらの機能を実際に実行する予定がある場合は、慎重に検討します。任意の機能を実行することは、危険なビジネスになる可能性があります。

編集:

実行したくない場合は実際にコードを実行しないことをもう少し確実にするために、別の行を追加しました。また、少しきれいになるように変更しました

于 2015-09-03T13:15:44.803 に答える
1

これを行う 1 つの方法はeval、文字列をコードとして解釈するを使用することです。

try:
    eval(myString)
except NameError:
    # not a function
于 2015-09-03T13:09:04.030 に答える