我已经读了如何获得一个函数名作为字符串?。
如何对变量做同样的事情呢?与函数相反,Python变量没有__name__属性。
换句话说,如果我有一个变量,比如:
foo = dict()
foo['bar'] = 2
我正在寻找一个函数/属性,例如retrieve_name(),以便从这个列表中创建一个DataFrame in Pandas,其中列名由实际字典的名称给出:
# List of dictionaries for my DataFrame
list_of_dicts = [n_jobs, users, queues, priorities]
columns = [retrieve_name(d) for d in list_of_dicts]
这里有一种方法。我不建议在任何重要的事情上使用它,因为它会很脆。但这是可以做到的。
创建一个使用inspect模块查找调用它的源代码的函数。然后可以解析源代码,以识别想要检索的变量名。例如,这里有一个名为autodict的函数,它接受一个变量列表,并返回一个将变量名映射到变量值的字典。例如:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
将:
{'x': 'foo', 'y': 'bar'}
检查源代码本身比搜索locals()或globals()更好,因为后一种方法不会告诉您哪些变量是您想要的。
无论如何,代码如下:
def autodict(*args):
get_rid_of = ['autodict(', ',', ')', '\n']
calling_code = inspect.getouterframes(inspect.currentframe())[1][4][0]
calling_code = calling_code[calling_code.index('autodict'):]
for garbage in get_rid_of:
calling_code = calling_code.replace(garbage, '')
var_names, var_values = calling_code.split(), args
dyn_dict = {var_name: var_value for var_name, var_value in
zip(var_names, var_values)}
return dyn_dict
该动作发生在inspect的行中。Getouterframes,它返回调用autodict的代码中的字符串。
这种魔法的明显缺点是,它对源代码的结构做出了假设。当然,如果它在解释器内部运行,它根本就不起作用。
如果您已经有了一个数据框架列表,如注释中所述,那么将该列表转换为字符串列表是很容易的。
不是从变量列表到字符串,而是用内置的exec函数结合f-strings(假设变量已经赋值,即vel, vol和area是现有pandas数据框架的变量名)走另一条路,将字符串列表到变量:
If:
dfstr_list = [
'vel',
'vol',
'area'
]
这将遍历列表并使用每个dataframe写入excel,并定义sheetname:
for dfstr in dfstr_list:
if dfstr in globals():
exec(f"{dfstr}.to_excel(writer,sheet_name=dfstr)")
这里有一种方法。我不建议在任何重要的事情上使用它,因为它会很脆。但这是可以做到的。
创建一个使用inspect模块查找调用它的源代码的函数。然后可以解析源代码,以识别想要检索的变量名。例如,这里有一个名为autodict的函数,它接受一个变量列表,并返回一个将变量名映射到变量值的字典。例如:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
将:
{'x': 'foo', 'y': 'bar'}
检查源代码本身比搜索locals()或globals()更好,因为后一种方法不会告诉您哪些变量是您想要的。
无论如何,代码如下:
def autodict(*args):
get_rid_of = ['autodict(', ',', ')', '\n']
calling_code = inspect.getouterframes(inspect.currentframe())[1][4][0]
calling_code = calling_code[calling_code.index('autodict'):]
for garbage in get_rid_of:
calling_code = calling_code.replace(garbage, '')
var_names, var_values = calling_code.split(), args
dyn_dict = {var_name: var_value for var_name, var_value in
zip(var_names, var_values)}
return dyn_dict
该动作发生在inspect的行中。Getouterframes,它返回调用autodict的代码中的字符串。
这种魔法的明显缺点是,它对源代码的结构做出了假设。当然,如果它在解释器内部运行,它根本就不起作用。
如果目标是帮助您跟踪变量,您可以编写一个简单的函数来标记变量并返回其值和类型。例如,假设i_f=3.01,并将其舍入为一个名为i_n的整数以用于代码,然后需要一个字符串i_s用于报告。
def whatis(string, x):
print(string+' value=',repr(x),type(x))
return string+' value='+repr(x)+repr(type(x))
i_f=3.01
i_n=int(i_f)
i_s=str(i_n)
i_l=[i_f, i_n, i_s]
i_u=(i_f, i_n, i_s)
## make report that identifies all types
report='\n'+20*'#'+'\nThis is the report:\n'
report+= whatis('i_f ',i_f)+'\n'
report+=whatis('i_n ',i_n)+'\n'
report+=whatis('i_s ',i_s)+'\n'
report+=whatis('i_l ',i_l)+'\n'
report+=whatis('i_u ',i_u)+'\n'
print(report)
这将在每次调用时打印到窗口中用于调试,并为书面报告生成一个字符串。唯一的缺点是每次调用函数时都必须输入两次变量。
I am a Python newbie and found this very useful way to log my efforts as I program and try to cope with all the objects in Python. One flaw is that whatis() fails if it calls a function described outside the procedure where it is used. For example, int(i_f) was a valid function call only because the int function is known to Python. You could call whatis() using int(i_f**2), but if for some strange reason you choose to define a function called int_squared it must be declared inside the procedure where whatis() is used.
每当我必须这样做时,主要是在与前端通信json模式和常量时,我定义了一个类,如下所示
class Param:
def __init__(self, name, value):
self.name = name
self.value = value
然后用名称和值定义变量。
frame_folder_count = Param({'name':'frame_folder_count', 'value':10})
现在可以使用对象访问名称和值。
>>> frame_folder_count.name
'frame_folder_count'