【发布时间】:2013-09-13 04:30:58
【问题描述】:
所以我创建了一个函数,该函数将一个动作(在这种情况下是数组与正弦曲线的逐点乘法,但这对我的问题无关紧要)应用于数组。
现在我创建了另一个函数,我想用它创建一个 string 的 python 代码,以便以后多次应用第一个函数。第二个函数的输入可以是string 或array,因此如果需要,我也可以在其自己的输出上使用第二个函数。我在字符串中获取变量名的方法在函数之外工作。
输入:
var = np.array([[1,3],[2,4]]) # or sometimes var = 'a string'
if type(var)==str:
var_name = var
else:
var_name = [ k for k,v in locals().items() if v is var][0]
var_name
输出:
'var'
所以这里的var 是提供给函数的变量(数组或字符串),在本例中是一个数组。 if 语句很好地返回了它的名字。
但是,当我在函数中使用它时,无论我给它什么输入,它实际上似乎都在 locals() 中寻找 var。不知何故,它不会从函数输入中获取 var。
定义:
def functionTWO(var, listoflistsofargs=None):
if type(var)==str:
var_name = var
else:
var_name = [ k for k,v in locals().items() if v is var][0]
if listoflistsofargs==None:
return var_name
command = []
for i in range(len(listoflistsofargs)):
if i==0:
command.append('functionONE(')
command.append(var_name)
command.append(',%.17f, %.17f)' % tuple(listoflistsofargs[i]))
else:
command.insert(0,'functionONE(')
command.append(',%.17f, %.17f)' % tuple(listoflistsofargs[i]))
''.join(command)
command[0] = var_name + ' + ' + command[0]
return ''.join(command)
输入:
somearray = np.array([[1,2,3],[1,2,3],[1,2,3]])
args = [[1,3],[6,5]]
command = functionTWO(somearray, args)
command
输出:
NameError: name 'var' is not defined
想要的输出:
'functionONE(functionONE(somearray, 1, 3), 6, 5)'
为什么listoflistsofargs取自函数输入而var不是?我在functionTWO 的定义中的列表理解中指定了var。通常,当我将列表推导与函数输入一起使用时,它可以正常工作。有谁知道为什么这里不是这种情况?提前谢谢!
编辑:所以我猜答案是不要。 Marcin 的类实现看起来更简洁,代码量也差不多。太糟糕了,我无法让它在函数中工作。对于其他关于使用变量名作为字符串的donts(实际上是其他想法)有this 问题,在那里我得到了上面对变量名的列表理解。
【问题讨论】:
-
为什么不直接把变量名传给函数呢?这似乎比您现在尝试做的打字少得多。它也会更明确,更不容易出错。
-
@sybren 好吧,我希望能够在片场任意多次执行相同的功能。我可以很容易地在命令控制台中输入它感觉很愚蠢,但我不知道一个简单的方法来让一个函数做到这一点,所以我只是让函数输入它。猜猜有“更好”的方法。我会尝试学习它们:)
标签: python string function variables locals