我最近发现我可以用 Python 做到这一点:
>>> obj = type("SomeObj", (), {1: "a", 2: "b", 3: "c"})()
>>> obj
<__main__.SomeObj object at 0x123456789>
对象obj
肯定有属性1
、2
和3
,如dir( )
显示:
>>> dir(obj)
[1, 2, 3, '__class__', '__delattr__', '__dict__', ...]
但是,我无法检索三个属性之一的值。
>>> obj.1
File "<stdin>", line 1
obj.1
^
SyntaxError: invalid syntax
>>> getattr(obj, "1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'ObjectifiedDict' object has no attribute '1'
>>> obj.__getattribute__(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: attribute name must be string, not 'int'
有什么办法吗? 我知道使用整数作为属性名称通常是一个坏的想法,这让我很好奇。
最佳答案
您正在将字典传递给可以使用整数作为键的类型,没有检查类型以查看您是否传递了有效的 name。所以你得到一个 SyntaxError 试图稍后访问该属性:
Identifiers (also referred to as names) are described by the following >lexical definitions: identifier ::= (letter|"") (letter | digit | "")*
属性必须作为字符串传递给 hasattr 和 getattr,在尝试查找之前会引发异常。
PyDoc_STRVAR(hasattr_doc,
"hasattr(object, name) -> bool\n\
\n\
Return whether the object has an attribute with the given name.\n\
(This is done by calling getattr(object, name) and catching exceptions.)");
PyDoc_STRVAR(getattr_doc,
"getattr(object, name[, default]) -> value\n\
\n\
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
When a default argument is given, it is returned when the attribute doesn't\n\
exist; without it, an exception is raised in that case.");
if (!PyString_Check(name)) {
PyErr_SetString(PyExc_TypeError,
"hasattr(): attribute name must be string");
return NULL;
}
if (!PyString_Check(name)) {
PyErr_SetString(PyExc_TypeError,
"getattr(): attribute name must be string");
return NULL;
}
整数作为属性名称通常是个坏主意,由于上述原因,不可能。
你还会得到一个 TypeError: unorderable types: int() < str()
使用 dir
在 python 3 中,属性得到排序:
PyDoc_STRVAR(dir_doc,
"dir([object]) -> list of strings\n"
"\n"
"If called without an argument, return the names in the current scope.\n"
"Else, return an alphabetized list of names comprising (some of) the attributes\n"
"of the given object, and of attributes reachable from it.\n"
"If the object supplies a method named __dir__, it will be used; otherwise\n"
"the default dir() logic is used and returns:\n"
" for a module object: the module's attributes.\n"
" for a class object: its attributes, and recursively the attributes\n"
" of its bases.\n"
" for any other object: its attributes, its class's attributes, and\n"
" recursively the attributes of its class's base classes.");
关于Python:从对象中获取具有整数名称的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29968892/