前几天我在网上搜索,发现了一篇关于python词典的有趣文章。它是关于使用字典中的键来调用函数。在那篇文章中,作者定义了一些函数,然后是一个字典,其键与函数名完全相同。然后他可以从用户获取输入参数并调用相同的方法(类似于实现大小写) 在那之后我意识到了同样的事情,但不知何故有所不同。我想知道如何实现这一点。 如果我有一个功能:
def fullName( name = "noName", family = "noFamily" ):
return name += family
现在如果我有这样的字符串:
myString = "fullName( name = 'Joe', family = 'Brand' )"
有没有办法执行此查询并获得结果:JoeBrand
例如,我记得的是我们可能会给exec()语句一个字符串,它会为我们做。但是我不确定这个特例,而且我也不知道Python的有效方法。而且我将非常感谢帮助我如何处理函数返回值,例如在我的情况下如何打印该函数返回的全名?
答案 0 :(得分:41)
这并不能完全回答你的问题,但也许它会有所帮助:
如上所述,如果可能,应避免使用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
答案 1 :(得分:29)
您可以使用eval():
myString = "fullName( name = 'Joe', family = 'Brand' )"
result = eval(myString)
请注意,eval()
被许多人视为 evil 。
答案 2 :(得分:8)
我知道这个问题相当陈旧,但你可以这样做:
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)