我有枚举并使用变量,如myEnum.SomeNameA
,myEnum.SomeNameB
等.当我从函数返回其中一个变量时,我可以打印它们的名称(例如myEnum.SomeNameA
)而不是它们返回的值吗?
Jay*_*Jay 32
简答:不.
答案很长:这可能是一些丑陋的黑客使用追溯,检查等,但通常不建议用于生产代码.例如见:
也许您可以使用变通方法将值转换回名称/表示字符串.如果您发布更多示例代码和有关您想要的内容的详细信息,我们可以提供更深入的帮助.
Joh*_*ret 25
没有独特或原始的变量名称 http://www.amk.ca/quotations/python-quotes/page-8
就像你得到你在门廊上找到的那只猫的名字一样:猫(对象)本身不能告诉你它的名字,它并不真正关心 - 所以找出它的名字的唯一方法是问所有邻居(名称空间)是否是他们的猫(对象)......
....如果你发现它被许多名字所知,或者根本没有名字,也不要感到惊讶!
Fredrik Lundh,2000年11月3日,回答了"当我有PyObject*时如何从C++中获取变量名称?"的问题.
gah*_*ooa 23
要添加@ Jay的答案,一些概念......
Python"变量"只是对值的引用.每个值占用给定的内存位置(请参阅id()
)
>>> id(1)
10052552
>>> sys.getrefcount(1)
569
Run Code Online (Sandbox Code Playgroud)
从上面可以看出,值"1"出现在存储器位置10052552处.在这个解释器的实例中,它被称为569次.
>>> MYVAR = 1
>>> sys.getrefcount(1)
570
Run Code Online (Sandbox Code Playgroud)
现在,看到因为另一个名称绑定到此值,引用计数增加了一个.
基于这些事实,判断单个变量名称指向值是不现实/可能的.
我认为解决问题的最佳方法是将枚举引用中的映射和函数添加回字符串名称.
myEnum.get_name(myEnum.SomeNameA)
Run Code Online (Sandbox Code Playgroud)
如果您想要示例代码,请发表评论.
在您使用枚举的情况下,这很容易:
>>> from enum import Enum
>>> class Type(Enum):
... AB, SBS, INTERLACED, SPLIT = range(4)
...
>>> Type.AB
<Type.AB: 0>
>>> print(Type.AB)
Type.AB
>>> Type.AB.name
'AB'
>>> Type.AB.value
0
>>> Type(0)
<Type.AB: 0>
Run Code Online (Sandbox Code Playgroud)
一般来说,它可能是模棱两可的:
>>> def varname(v): d = globals(); return [k for k in d if d[k] == v]
...
>>> def varnameis(v): d = globals(); return [k for k in d if d[k] is v]
...
>>> foo = {'a':'aap'}
>>> bar = {'a':'aap'}
>>> varname(foo)
['foo', 'bar']
>>> varnameis(foo)
['foo']
Run Code Online (Sandbox Code Playgroud)
甚至误导:
>>> foo = "A"; bar = "A"
>>> varnameis("A")
['foo', 'bar']
>>> foo = "An immutable value."; bar = "An immutable value."
>>> varnameis("An immutable value.")
[]
>>> foo = "An immutable value."; bar = "An immutable value."; varnameis("An immutable value.")
['foo', 'bar']
>>> import sys; sys.version
'3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 02:47:15) [MSC v.1900 32 bit (Intel)]'
Run Code Online (Sandbox Code Playgroud)
要在任何范围内搜索,请使用以下命令:
>>> def varname(v, scope=None): d = globals() if not scope else vars(scope); return [k for k in d if d[k] == v]
...
>>> import time
>>> time.timezone
-3600
>>> varname(-3600)
[]
>>> varname(-3600, time)
['timezone']
Run Code Online (Sandbox Code Playgroud)
为避免歧义,请将您的名字用 data 包裹起来。
小智 7
Python的3.8增添了新的可能是一个LITTLE较好地解决了这一点:
my_nice_variable_name = 'test'
print(f'{my_nice_variable_name=}')
# Output:
# my_nice_variable_name='test'
Run Code Online (Sandbox Code Playgroud)
在这里,您可以使用字符串输出。仍然不可取,但可能比其他方法好一点。
小智 6
import inspect
def printVariableName(abc):
newvar=inspect.stack()[1][4][0]
print(newvar.split("(")[1].split(")")[0])
noob=10
printVariableName(noob)
Run Code Online (Sandbox Code Playgroud)
输出:
noob
Run Code Online (Sandbox Code Playgroud)
只需使用您要打印的文本作为枚举的值,如
class MyEnum (object):
valueA = "valueA"
valueB = "valueB"
Run Code Online (Sandbox Code Playgroud)
比较字符串的标识在Python中几乎与比较整数值一样有效(这是因为字符串是不可变的,因为有一个哈希值)
当然,首先有更简单的方法来创建枚举:
class Enum (object):
def __init__(self, *values):
for v in values:
self.__dict__[v] = v
Run Code Online (Sandbox Code Playgroud)
然后,像这样创建枚举:
MyEnum = Enum("valueA", "valueB")
Run Code Online (Sandbox Code Playgroud)
ans访问方式与上面相同:
MyEnum.valueA
Run Code Online (Sandbox Code Playgroud)