从函数外部返回变量名,作为python函数内部的字符串
因此,我创建了一个函数,将一个动作(在本例中,是一个数组与正弦曲线的逐点乘法,但这对我的问题并不重要)应用于一个数组 现在我已经创建了另一个函数,我想用它创建python代码的从函数外部返回变量名,作为python函数内部的字符串,python,string,function,variables,locals,Python,String,Function,Variables,Locals,因此,我创建了一个函数,将一个动作(在本例中,是一个数组与正弦曲线的逐点乘法,但这对我的问题并不重要)应用于一个数组 现在我已经创建了另一个函数,我想用它创建python代码的字符串,以便在以后多次应用第一个函数。第二个函数的输入可以是字符串或数组,因此,如果需要,我也可以在其自身的输出上使用第二个函数。我在字符串中获取变量名的方法在函数外部工作 输入: var = np.array([[1,3],[2,4]]) # or sometimes var = 'a string' if type(
字符串,以便在以后多次应用第一个函数。第二个函数的输入可以是字符串
或数组
,因此,如果需要,我也可以在其自身的输出上使用第二个函数。我在字符串中获取变量名的方法在函数外部工作
输入:
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'
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)'
输出:
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'
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)'
因此这里var
是提供给函数的变量(数组或字符串),在本例中是数组。if语句很好地返回了它的名称
然而,当我在函数中使用它时,无论我给它什么输入,它实际上似乎都在本地()中查找var。不知何故,它不会从函数输入中获取var
定义:
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'
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)'
输入:
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'
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)'
输出:
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'
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)'
想要的输出:
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'
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)'
为什么listofsofarges
取自函数输入,而var
不取自函数输入?我在functionTWO
的定义的列表中指定var
。通常,当我将列表理解与函数输入一起使用时,它工作得很好。有人知道为什么这里不是这样吗?提前谢谢你
编辑:所以我猜答案是不要。Marcin实现的类看起来更干净,代码数量的顺序也差不多。太糟糕了,我不能让它在函数中工作。对于使用变量名作为字符串的其他方法(实际上是其他方法),有一个问题,我从哪里得到了上面列表中对变量名的理解。不能将变量作为字符串*传递,也不应该这样做
如果要在函数之间传递值,通常的方法是将其作为参数传入,作为返回值传出
如果这不方便,通常的解决方案是对象:定义一个包含共享变量和作用于该变量的方法的类
如果需要创建命令对象,最好以结构化的方式创建。例如,如果要传递函数和参数,可以直接传递元组中的函数对象和参数:
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)
尽管有一些黑客可以将对局部变量的引用从函数中传递出去,但这并不是一个好主意,因为最终会创建自己的半成品对象系统,这更难理解
*
这是因为变量具有名称(即字符串)和上下文,后者将名称映射到字符串。因此,您至少需要传递一个元组才能真正传递一个变量。当您将名称“var”全部封装到函数中时,出现错误的原因是:locals()。items()
指的是本地定义的变量。事实上,函数中本地定义的变量只是函数内部定义的变量以及作为参数传递给函数的变量
正如名字所说,locals().items()
是本地的,它由不同的变量组成,具体取决于在脚本中调用它的位置
相反,globals().items()
由所有全局变量组成,因此请尝试在函数中使用它,它应该可以做到这一点
有关更多信息,请在Python中查找全局和局部变量以及变量的范围。演示者的答案在Python 3中有效
def get_variable_name(*variable):
return [ k for k,v in globals().items() if v is variable[0]][0]
例如:
>> test = 'sample string'
>> get_variable_name(test)
'test'
>>
唯一的问题是它有点乱 为什么不把变量名传递给函数呢?这似乎比你现在要做的要少得多。它也会更明确,更不容易出现错误。@sybren嗯,我希望能够在集合中任意次数地执行相同的功能。我觉得很傻,我可以很容易地在命令控制台中键入它,但我不知道一种简单的方法来让函数这样做,所以我只是让函数键入它。我想有更好的方法。我会试着学习:)不能是一个比我会用的更强有力的词,但是是的+1@JoranBeasley很公平,但正如OP的麻烦所表明的,它并不是真正传递变量,而是传递一个没有上下文的名称。@Marcin非常好的解释,谢谢!它仍然困扰着我,没有更快的方式来做一些事情,我可以在控制台中很快键入自己。您的解决方案比我的更优雅(最终我求助于为这个函数保留一个全局变量)。为了能够使用您的解决方案,我必须研究什么是类以及它们是如何工作的。但我想这不会是我最后一次需要它们。因此,感谢您的解决方案和解释为什么不推荐我的方法。@Leo不客气。如果您使用的是全局变量,那么这也是您应该使用类的标志。简言之,类就是您在上面看到的:声明class():
,后面是函数(方法)列表,这些函数(方法)将类的实例作为它们的第一个参数(self
)。对象实例变量由self.
访问。您可以通过调用类来创建实例(使用\uuuu init\uuu
的参数,除了self
)。实例具有不同于其他实例的变量(除非在类主体中定义)。