Python: get attribute with integer name from object

I recently discovered that I can do this in Python:

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

An object objdefinitely has attributes 1, 2and 3since it dir()shows:

>>> dir(obj)
[1, 2, 3, '__class__', '__delattr__', '__dict__', ...]

However, I could not get the value of one of the three attributes.

>>> 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'

Is there any way to do this? I know that using integers as attribute names is usually a bad idea , it just made me curious.

+4
source share
2 answers

dict , ints , , , name, SyntaxError, :

( ) > :     :: = ( | ") ( | |" ") *

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

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 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 attributes, and\n"
"    recursively the attributes of its class base classes.");
+2

1 2 3 arguments

obj = type("SomeObj", (), {1: "a", 2: "b", 3: "c"})()
obj.__class__.__dict__[1]
obj.__class__.__dict__[2]
obj.__class__.__dict__[3]

, ..... - , python 3.4.1 Python 2.7.6

EDIT Veedrac

vars(type(obj))[1]
vars(type(obj))[2]
vars(type(obj))[3]

2

vars(type(obj))[1]="change"  # or obj.__class__.__dict__[1]="change"

Traceback ( ):

", 1,

TypeError: " dictproxy"

 setattr(type(obj), 1, "change")

Traceback ( ):

"", 1,

TypeError: , 'int'

0

All Articles