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



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

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)

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

不建议按照您要求的方式进行操作,因为它不是显式的,可能很难调试,一个值可以有多个变量名,并且如果在函数内部调用,它可能不会按预期工作(您应该避免依赖全局性(。

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

最好使用带有关键字参数的函数。您是否有意将列名大写?

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,因为Coconuts对象在参数列表中,因为香蕉和椰子变量名都引用同一个对象。只接受其中一个并不是一个解决方案,因为代码不知道用来调用它的变量名是香蕉还是椰子——你会有50/50的猜测。这可以通过实际检查调用源代码并查找传递给函数的名称来解决。这是可行的,但我们越来越荒谬。这不是语言的使用方式,您的代码很可能会出现错误。你应该在这个答案的顶部使用关键字arguments方法,这是一种很好的方法。

类似的东西

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

最新更新