gpt4 book ai didi

python - 将变量名转换为字符串?

转载 作者:IT老高 更新时间:2023-10-28 20:25:44 30 4
gpt4 key购买 nike

我想将 python 变量名称转换为等效的字符串,如图所示。有什么想法吗?

var = {}
print ??? # Would like to see 'var'
something_else = 3
print ??? # Would print 'something_else'

最佳答案

TL;DR:不可能。见最后的“结论”。


有一个使用场景,您可能需要它。我并不是暗示没有更好的方法或实现相同的功能。

这对于在出错、 Debug模式和其他类似情况下“转储”任意字典列表很有用。

需要的是 eval() 的反面功能:

get_indentifier_name_missing_function()

将标识符名称('变量','字典'等)作为参数,并返回一个包含标识符名称的字符串。


考虑以下现状:

random_function(argument_data)

如果传递一个标识符名称('function'、'variable'、'dictionary'等)argument_datarandom_function() (另一个标识符名称),实际上将一个标识符(例如:<argument_data object at 0xb1ce10>)传递给另一个标识符(例如:<function random_function at 0xafff78>):

<function random_function at 0xafff78>(<argument_data object at 0xb1ce10>)

据我了解,只有内存地址被传递给函数:

<function at 0xafff78>(<object at 0xb1ce10>)

因此,需要将字符串作为参数传递给 random_function()为了使该函数具有参数的标识符名称:

random_function('argument_data')

random_function()内部

def random_function(first_argument):

,可以使用已经提供的字符串 'argument_data'到:

  1. 用作“标识符名称”(用于显示、记录、字符串拆分/合并等)

  2. eval()函数以获取对实际标识符的引用,从而获得对真实数据的引用:

    print("Currently working on", first_argument)
    some_internal_var = eval(first_argument)
    print("here comes the data: " + str(some_internal_var))

不幸的是,这并不适用于所有情况。它仅在 random_function() 时有效可以解决'argument_data'字符串到实际标识符。 IE。如果 argument_data标识符名称在 random_function() 中可用的命名空间。

情况并非总是如此:

# main1.py
import some_module1

argument_data = 'my data'

some_module1.random_function('argument_data')


# some_module1.py
def random_function(first_argument):
print("Currently working on", first_argument)
some_internal_var = eval(first_argument)
print("here comes the data: " + str(some_internal_var))
######

预期结果是:

Currently working on: argument_data
here comes the data: my data

因为argument_data标识符名称在 random_function() 中不可用的命名空间,这将产生:

Currently working on argument_data
Traceback (most recent call last):
File "~/main1.py", line 6, in <module>
some_module1.random_function('argument_data')
File "~/some_module1.py", line 4, in random_function
some_internal_var = eval(first_argument)
File "<string>", line 1, in <module>
NameError: name 'argument_data' is not defined

现在,考虑 get_indentifier_name_missing_function() 的假设用法其行为如上所述。

这是一个虚拟的 Python 3.0 代码:.

# main2.py
import some_module2
some_dictionary_1 = { 'definition_1':'text_1',
'definition_2':'text_2',
'etc':'etc.' }
some_other_dictionary_2 = { 'key_3':'value_3',
'key_4':'value_4',
'etc':'etc.' }
#
# more such stuff
#
some_other_dictionary_n = { 'random_n':'random_n',
'etc':'etc.' }

for each_one_of_my_dictionaries in ( some_dictionary_1,
some_other_dictionary_2,
...,
some_other_dictionary_n ):
some_module2.some_function(each_one_of_my_dictionaries)


# some_module2.py
def some_function(a_dictionary_object):
for _key, _value in a_dictionary_object.items():
print( get_indentifier_name_missing_function(a_dictionary_object) +
" " +
str(_key) +
" = " +
str(_value) )
######

预期结果是:

some_dictionary_1    definition_1  =  text_1
some_dictionary_1 definition_2 = text_2
some_dictionary_1 etc = etc.
some_other_dictionary_2 key_3 = value_3
some_other_dictionary_2 key_4 = value_4
some_other_dictionary_2 etc = etc.
......
......
......
some_other_dictionary_n random_n = random_n
some_other_dictionary_n etc = etc.

不幸的是,get_indentifier_name_missing_function()不会看到“原始”标识符名称( some_dictionary_some_other_dictionary_2some_other_dictionary_n )。它只会看到 a_dictionary_object标识符名称。

因此,真正的结果宁愿是:

a_dictionary_object    definition_1  =  text_1
a_dictionary_object definition_2 = text_2
a_dictionary_object etc = etc.
a_dictionary_object key_3 = value_3
a_dictionary_object key_4 = value_4
a_dictionary_object etc = etc.
......
......
......
a_dictionary_object random_n = random_n
a_dictionary_object etc = etc.

所以,eval() 的反面在这种情况下,函数不会那么有用。


目前,需要这样做:

# main2.py same as above, except:

for each_one_of_my_dictionaries_names in ( 'some_dictionary_1',
'some_other_dictionary_2',
'...',
'some_other_dictionary_n' ):
some_module2.some_function( { each_one_of_my_dictionaries_names :
eval(each_one_of_my_dictionaries_names) } )


# some_module2.py
def some_function(a_dictionary_name_object_container):
for _dictionary_name, _dictionary_object in a_dictionary_name_object_container.items():
for _key, _value in _dictionary_object.items():
print( str(_dictionary_name) +
" " +
str(_key) +
" = " +
str(_value) )
######

总结:

  • Python 仅将内存地址作为参数传递给函数。
  • 表示标识符名称的字符串,只能通过 eval() 引用回实际标识符如果名称标识符在当前命名空间中可用,则函数。
  • eval() 的假设反转函数,在调用代码没有直接“看到”标识符名称的情况下将没有用。例如。在任何被调用的函数中。
  • 目前需要传递给一个函数:
    1. 代表标识符名称的字符串
    2. 实际标识符(内存地址)

这可以通过同时传递 'string' 来实现和 eval('string')同时到被调用的函数。我认为这是跨任意函数、模块、 namespace 解决这个蛋鸡问题的最“通用”方法,而不使用极端情况解决方案。唯一的缺点是使用 eval()很容易导致代码不安全的函数。必须注意不要喂 eval()几乎可以处理任何事情,尤其是未经过滤的外部输入数据。

关于python - 将变量名转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1534504/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com