[] . Python |
"namedtuple", , , , . , .
? .
. .
>>> tup = ('hello', object(), 42)
>>> tup
('hello', , 42)
>>> tup[2]
42
>>> tup[2] = 23
TypeError: "'tuple' object does not support item assignment"
, . . .
, . , . slip-of-the-mind , .
.
, . , - .
, , ..., . , , . .
:
>>> from collections import namedtuple
>>> Car = namedtuple('Car' , 'color mileage')
, collections
. Python 2.6. "Car" : "color" "mileage".
. "color mileage"?
, split()
. , , , , :
>>> 'color mileage'.split()
['color', 'mileage']
>>> Car = namedtuple('Car', ['color', 'mileage'])
, , . , , :
>>> Car = namedtuple('Car', [
... 'color',
... 'mileage',
... ])
, "car" Car
. , Car
"color" "mileage":
>>> my_car = Car('red', 3812.4)
>>> my_car.color
'red'
>>> my_car.mileage
3812.4
'*' :
>>> color, mileage = my_car
>>> print(color, mileage)
red 3812.4
>>> print(*my_car)
red 3812.4
, . :
>>> my_car[0]
'red'
>>> tuple(my_car)
('red', 3812.4)
, :
>>> my_car
Car(color='red' , mileage=3812.4)
, , . , AttributeError
:
>>> my_car.color = 'blue'
AttributeError: "can't set attribute"
. , "", .
, .
, , .
>>> Car = namedtuple('Car', 'color mileage')
>>> class MyCarWithMethods(Car):
... def hexcolor(self):
... if self.color == 'red':
... return '#ff0000'
... else:
... return '#000000'
MyCarWithMethods hexcolor() , :
>>> c = MyCarWithMethods('red', 1234)
>>> c.hexcolor()
'#ff0000'
, . , . .
, - . ._fields :
>>> Car = namedtuple('Car', 'color mileage')
>>> ElectricCar = namedtuple(
... 'ElectricCar', Car._fields + ('charge',))
:
>>> ElectricCar('red', 1234, 45.0)
ElectricCar(color='red', mileage=1234, charge=45.0)
_fields , . , , "" .
, : . , , . , , !
. _asdict(). :
>>> my_car._asdict()
OrderedDict([('color', 'red'), ('mileage', 3812.4)])
JSON, :
>>> json.dumps(my_car._asdict())
'{"color": "red", "mileage": 3812.4}'
_replace(). (shallow) :
>>> my_car._replace(color='blue')
Car(color='blue', mileage=3812.4)
, , _make() :
>>> Car._make(['red', 999])
Car(color='red', mileage=999)
, .
, , , . , , .
, , ( ) .
, , , . .
, , , , Python .