Python从类函数中获取原始列表名称

时间:2021-01-14 04:50:19

标签: python variables global

感谢您的帮助。 导入类时如何访问全局变量名?我有多个带有变量名称的数字列表

apples=[1,2,3]
bananas=[4,5,6]
coconuts=[7,8,9]

我想从一个名为 funk.py 的外部文件调用的辅助类函数调用,以便将这些函数放入 Pandas dataFrame()

class funk:
def __init__(self,*args):
data=pd.DataFrame()
###if apples is in the list
data['Apples']=apples
###if bananas is in the list
data['Bananas']=bananas
###if bananas is in the list
data['Bananas']=bananas
###if bananas is in the list
data['Bananas']=bananas
###if coconuts is in the list
data['Coconuts']=coconuts
return data

然后调用 funk.funk(apples,bananas)

我不知道如何引用单个输入,按原始名称列出。我可以在函数的参数中明确添加可能的单个列表,但这似乎是多余的。

1 个答案:

答案 0 :(得分:1)

不建议按照您要求的方式做事,因为它不明确,可能难以调试,一个值可以有多个变量名,如果在函数内部调用它可能不会按预期工作(您应该避免依赖全局变量)。

此外,您可能想使用函数而不是类。您不能像代码所示那样从类构造函数中返回值,并且由于您没有使用 self 变量,因此您可能没有任何状态可以在方法调用之间进行跟踪,因此实际上并不需要班级。

最好使用带有关键字参数的函数。你是故意把列名大写吗?

import pandas as pd
def funk(**kwargs):
    data=pd.DataFrame()
    for kw,val_list in kwargs.items():
        data[kw.capitalize()] = val_list
    return data
apples=[1,2,3]
bananas=[4,5,6]
df=funk(apples=apples,bananas=bananas, coconuts=[7,8,9])

如果您真的真的想按照您的要求进行操作,并且变量确实在全局模块空间中,那么您可以执行以下操作:

import pandas as pd
def funk(*args):
    args_ids = set([id(arg) for arg in args])
    data = pd.DataFrame()
    for name,value in globals().items():
        if id(value) in args_ids:
            data[name.capitalize()] = value
    return data
apples=[1,2,3]
bananas=[4,5,6]
df=funk(apples,bananas)

如果你真的想说调用上下文而不是全局变量,比如说你想让它在函数内工作,那么你可以这样做:

import inspect, pandas as pd

def funk(*args):
    args_ids = set([id(arg) for arg in args])
    data = pd.DataFrame()
    for name,value in inspect.stack()[1].frame.f_locals.items():
        if id(value) in args_ids:
            data[name.capitalize()] = value
    return data
apples=[1,2,3]
bananas=[4,5,6]
df=funk(apples,bananas)

现在,后两种解决方案是坏主意的一个原因如下:

apples=[1,2,3]
bananas=[4,5,6]
coconuts = bananas
df=funk(apples,bananas) 

这个数据框实际上将包含三列:Apples、Bananas 和 Coconuts,因为椰子对象在参数列表中,因为香蕉和椰子变量名称都指向同一个对象。只接受其中一个不是解决方案,因为代码不知道哪个变量名称,香蕉或椰子是用来称呼它的——您将有 50/50 的猜测。这可以通过实际检查调用源代码并查找传递给函数的名称来解决。这是可行的,但我们越来越荒谬了。这不是该语言的使用方式,您的代码很可能有错误。您应该只使用此答案顶部的关键字参数方法,这是一种不错的做事方式。

相关问题