当前位置: 首页 > 面试题库 >

将变量名转换为字符串?

令狐灿
2023-03-14
问题内容

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

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

问题答案:

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

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

为了在调试,模式和其他类似情况下出现错误时“转储”任意词典列表,这将很有用。

需要的是该eval()功能的反向功能:

get_indentifier_name_missing_function()

它将以标识符名称(“变量”,“字典”等)作为参数,并返回包含标识符名称的字符串。

考虑以下当前状态:

random_function(argument_data)

如果将一个标识符名称(“函数”,“变量”,“字典”等)argument_data传递给random_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'字符串解析为实际标识符时,它才有效。即,如果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

现在,考虑a的假设用法,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')给被调用的函数来实现。我认为这是跨任意函数,模块,名称空间解决此蛋鸡问题的最“通用”方法,而无需使用极端案例解决方案。唯一的缺点是eval()函数的使用,这很容易导致代码不安全。必须注意不要向eval()函数提供几乎任何东西,尤其是未经过滤的外部输入数据。



 类似资料:
  • 问题内容: 我有任何字符串。像“水牛” 我想将此字符串转换为某些变量名称,例如, 不仅是这个例子,我还想将任何输入字符串转换为某个变量名。我该怎么做(在python中)? 问题答案: 之后,你可以通过以下方式进行检查: 作为输出,你将看到:

  • 问题内容: 我的变量在其中具有递增的数字,例如row0text,row1text,row2text等。 我已经找到了如何动态创建这些变量名的字符串版本的方法,但是一旦有了这些字符串,如何将它们用作实际的变量名而不是代码中的字符串? 例: 一旦知道如何执行此操作,就可以使用for循环遍历这些变量;只是目前我不确定如何在我的代码中将该字符串用作变量名。 谢谢! 问题答案: 简短的回答: 没有 充分的理

  • 问题内容: 我一直在寻找解决方案,但找不到任何可行的方法。 我有一个名为的变量。 字符串被传递给函数。我想将函数内部的变量设置为某种值。我怎样才能做到这一点? (可以在函数中调用许多变量,因此我需要它动态地工作,而不是硬编码的语句。) 编辑:可能有更好的方法来做您要尝试做的事情。 我在JavaScript冒险的早期就曾问过这个问题。查看JavaScript对象的工作方式。 一个简单的介绍: 问题答

  • 问题内容: 如何在Python中将字符串转换为变量名? 例如,如果程序包含一个名为的对象,该对象包含一个名为的变量,则我想执行以下操作: 问题答案: 如Stack Overflow问题中 从ConfigParser进行就地替换 所引用,您正在寻找:

  • 我正在尝试使用一个名为“start checknumber”的双变量,该变量的值应该为“40305555”,并将其转换为字符串。在调试我的代码时,startCheckNumber显示的值为4.030555e7。如果我执行以下命令将其转换为字符串,它将显示如下所示,而不是“4030555” 在这种情况下,有没有比使用ValueOf更好的方法将double变量转换为String?我尝试了'Double

  • 问题内容: 我有类似的问题,但是我不知道这个词是什么 它应该打印出来 所以我想知道是否有实际的方法或函数可以用来检索用作字符串的变量名。 问题答案: 您基本上是在问“我的代码如何发现对象的名称?” 一个报价从弗雷德里克Lundh开发(在comp.lang.python)是 特别 适用于本案。 获得在门廊上找到的那只猫的名字的方法相同:猫(对象)本身无法告诉您它的名字,并且它并不在乎–因此,找出猫叫