因此,我创建了一个函数,该函数将一个操作(在这种情况下,将数组与正弦波进行逐点乘法,但这对我的问题无关紧要)应用于数组。
现在,我创建了另一个函数,我想使用该函数创建string
python代码以在以后多次应用第一个函数。第二个函数的输入可以是astring
或an 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
不是?我var
在listcomprehension中指定的定义functionTWO
。通常,当我将列表推导与函数输入一起使用时,它可以正常工作。有人知道为什么这里不是这种情况吗?先感谢您!
编辑:所以我想答案不是。Marcin实现的类看起来更加简洁,并且代码量的顺序大致相同。太糟糕了,我无法在函数内部工作。对于其他donts(实际上其他的想法)关于使用变量名作为字符串有这个问题,在这里我得到了变量名上面的列表理解。
您不能将变量作为字符串*传递,也不应这样做。
如果要在函数之间传递值,通常的方法是将其作为参数传递,然后作为返回值传递。
如果不方便,通常的解决方案是一个对象:定义一个既包含共享变量又作用于变量的方法的类。
如果需要创建命令对象,最好以结构化的方式进行。例如,如果要传递函数和参数,则可以从字面上传递元组中的函数对象和参数:
def foo():
return (functionONE,somearray,1,3)
command = foo()
command[0](*command[1:])
如果要将此类命令嵌入命令中,则可能需要用一个类将其包装起来,以便可以递归地评估参数。实际上,这里有一个小评估者:
def evaluator(object):
def __init__(self,func=None,params=None):
self.func = func
self.params = params
def eval(self,alternativeparams=None):
if alternativeparams is not None:
params = alternativeparams
else:
params = self.params
if params is not None:
evaluatedparams = (item() if callable(item) else item for item in params)
else: evaluatedparams = None
if func is not None:
return self.func(*(evaluatedparams or ()))
else: return evaluatedparams
def __call__(self, *params):
return self.eval(params if params else None)
尽管有一些技巧可以使您从函数中传递对局部变量的引用,但这并不是一个好主意,因为您最终会创建自己的半熟对象系统,这很难理解。
*
这是因为变量具有名称(是字符串)和上下文,该上下文将名称映射到字符串。因此,您至少需要传递一个元组才能真正传递一个变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句