Python:从对象中获取具有整数名称的属性

标签 python python-2.7 attributes integer

我最近发现我可以用 Python 做到这一点:

>>> obj = type("SomeObj", (), {1: "a", 2: "b", 3: "c"})()
>>> obj
<__main__.SomeObj object at 0x123456789>

对象obj肯定有属性123,如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 | "")*

属性必须作为字符串传递给 hasattrgetattr,在尝试查找之前会引发异常。

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;
}

bltinmodule.c

typeobject.c

整数作为属性名称通常是个坏主意,由于上述原因,不可能

你还会得到一个 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/

相关文章:

python - 如何连接列值在一定范围内的两个数据框?

python - 在Python for循环中改变 float 的值

python - 使用请求上传文件并发送额外数据

validation - 全局本地化验证

python - scipy:插值,三次和线性

python - 使用字典使用 Python 将罗马数字转换为整数

python - 有条件映射的模块导入

python-2.7 - 如何使用 PySpark 并行运行独立转换?

php - 使用 SimpleXML 加载 XML 不返回某些元素的属性

class - 如何间接访问类的属性