嘿,我正在尝试在函数中使用字符串,但是当我将其放在''中时。 我想要得到的结果就是这个。
foo(bar = 1)
但是使用这样的字符串。
string = 'bar = 1'
foo(string)
但是它出来的样子。
foo('bar = 1')
谢谢。
答案 0 :(得分:2)
我认为这个问题归结为命名参数和位置参数之间的区别。
让我们定义一个函数foo(bar)
:
def foo(bar):
print(bar, "(type: " + str(type(bar)) + ")")
现在,让我们运行一些示例:
foo(1)
# 1 (type: <class 'int'>)
这是一个位置参数,按照给定的顺序进入函数。
在这种情况下,只有一个参数,因此它进入foo
函数的第一个位置,即参数bar
。
foo(bar=1)
# 1 (type: <class 'int'>)
这是以前版本的等效名称。而不是将其作为第n个参数输入到函数中,而是显式将其输入到名为bar
的参数中。
foo('bar=1')
# bar=1 (type: <class 'str'>)
这是一个位置参数,字符串为'bar=1'
。 Python不在乎该字符串的内容是什么,而是将字符串保留在内容'bar=1'
中。
我怀疑您要执行的操作是喂入名为arguments的函数,但要在类似dict的结构中定义参数。您可以这样实现:
args = {'bar': 1}
foo(**args)
# 1 (type: <class 'int'>)
通过这种方式,将字典args
用作该函数的命名参数。
现在回到您最初遇到的问题,即如何使用字符串'bar=1'
获得相同的结果。我认为这不可能轻易实现。它将涉及手动解析字符串,然后设置命名参数的字典。我不确定您要使用它做什么,但是肯定有比使用字符串更好的解决方案。
答案 1 :(得分:0)
您尝试实现的目标可能是bash和其他一些字符串类型的语言,而不是Python。
这也许是您可以在Python中执行的最接近的操作。
var_name = 'bar'
var_value = 1
foo(**{var_name: var_value})
# equivalent to foo(bar=1)
答案 2 :(得分:0)
将字符串转换为字典,在转换为int时不会忘记可能的错误:
def foo(bar = 1):
print('bar:', type(bar), bar)
s = 'bar = 170'
d = {k.strip(): int(v.strip()) for k, v in [s.split('=', 1)]}
print('d:', type(d), d)
foo(**d)
输出:
d: <class 'dict'> {'bar': 170}
bar: <class 'int'> 170
如果需要使用INI文件,则Python具有configparse
模块。
答案 3 :(得分:-1)
您可以使用exec
来评估字符串,就像它是“键入”一样。
def foo(bar):
print bar
foo(bar=1)
argString = "bar=1"
foo(argString)
exec("foo(" + argString + ")")
运行此:
1
bar=1
1
但是通常使用exec / eval not recommended,所以如果我是我,我仍然会尝试其他方法。