web-dev-qa-db-ja.com

文字列を使用してPython

数日前、私はネットで検索していて、python辞書についての興味深い記事を見つけました。それは、関数を呼び出すために辞書のキーを使用することに関するものでした。その記事で、著者はいくつかを定義しました関数、そして関数名とまったく同じキーを持つディクショナリ。次に、ユーザーから入力パラメーターを取得して同じメソッドを呼び出すことができます(ケースブレークの実装のようなもの)。その後、同じことについてなんとなく異なることに気付きました。これをどのように実装できるかを知るためです。関数がある場合:

def fullName( name = "noName", family = "noFamily" ):
    return name += family

そして今、私がこのような文字列を持っている場合:

myString = "fullName( name = 'Joe', family = 'Brand' )"

このクエリを実行して結果を取得する方法はありますか:JoeBrand
たとえば、私が覚えていることの1つは、exec()ステートメントに文字列を与え、それを実行することです。しかし、私はこの特別なケースについて確信が持てず、Pythonでの効率的な方法もわかりません。また、その関数の戻り値を処理する方法を手伝ってくれてとても感謝しています。たとえば、私の場合、その関数によって返されたフルネームをどのように出力できますか?

27
user435245

eval() を使用できます:

_myString = "fullName( name = 'Joe', family = 'Brand' )"
result = eval(myString)
_

ただし、eval()は多くの人によってevilと見なされています。

29

これはあなたの質問に正確に答えるものではありませんが、それでもそれでも役立つかもしれません:

既に述べたように、evalは可能な限り回避する必要があります。 imoのより良い方法は、辞書のアンパックを使用することです。これも非常に動的で、エラーが発生しにくくなっています。

例:

def fullName(name = "noName", family = "noFamily"):
    return name + family

functionList = {'fullName': fullName}

function = 'fullName'
parameters = {'name': 'Foo', 'family': 'Bar'}

print functionList[function](**parameters)
# prints FooBar

parameters = {'name': 'Foo'}
print functionList[function](**parameters)
# prints FoonoFamily
43
Felix Kling

この質問はかなり古いですが、次のようなことができます。

argsdict = {'name': 'Joe', 'family': 'Brand'}
globals()['fullName'](**argsdict)

argsdictは引数の辞書、globalsは文字列を使用して関数を呼び出し、**は、辞書をパラメータリストに展開します。 evalよりもはるかにクリーンです。唯一の問題は、文字列を分割することです。 (非常に厄介な)ソリューション:

example = 'fullName(name=\'Joe\',family=\'Brand\')'
# Split at left parenthesis
funcname, argsstr = example.split('(')
# Split the parameters
argsindex = argsstr.split(',')
# Create an empty dictionary
argsdict = dict()
# Remove the closing parenthesis
# Could probably be done better with re...
argsindex[-1] = argsindex[-1].replace(')', '')
for item in argsindex:
    # Separate the parameter name and value
    argname, argvalue = item.split('=')
    # Add it to the dictionary
    argsdict.update({argname: argvalue})
# Call our function
globals()[funcname](**argsdict)
8
kirbyfan64sos