感谢您的帮助。 导入类时如何访问全局变量名?我有多个带有变量名称的数字列表
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)
我不知道如何引用单个输入,按原始名称列出。我可以在函数的参数中明确添加可能的单个列表,但这似乎是多余的。
答案 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 的猜测。这可以通过实际检查调用源代码并查找传递给函数的名称来解决。这是可行的,但我们越来越荒谬了。这不是该语言的使用方式,您的代码很可能有错误。您应该只使用此答案顶部的关键字参数方法,这是一种不错的做事方式。