繁体   English   中英

从函数外部返回变量名,作为python函数内的字符串

[英]return variable name from outside of function, as string inside python function

所以我创建了一个函数,它将一个动作(在这种情况下是一个带有正弦曲线的数组的点乘法,但这对我的问题无关紧要)应用于一个数组。

现在我已经创建了另一个函数,我想创建一个python代码string ,以便稍后多次应用第一个函数。 第二个函数的输入可以是stringarray ,因此如果需要,我也可以在自己的输出上使用第二个函数。 我在字符串中获取变量名的方法在函数之外工作。

输入:

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的定义中指定了listcomprehension中的var 通常当我使用列表推导与函数输入时,它工作正常。 有谁知道为什么这不是这里的情况? 先感谢您!

编辑:所以我想答案是 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)

虽然有些hacks可以通过函数传递对局部变量的引用,但这些并不是一个好主意,因为你最终会创建一个更难以理解的半自动对象系统。

*这是因为变量具有名称(字符串)和上下文,它将名称映射到字符串。 所以,你需要,至少传递一个元组来真正传递一个变量。

当您将其全部包装到函数中时, NameError: name 'var' is not defined错误NameError: name 'var' is not defined的原因如下: 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'
>>

唯一的问题是它有点凌乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM