Ну или как создать dotted dict
При работе с Python частенько, по привычке, хочется притянуть что-нибудь из других языков. Не всегда это полезно и правильно, но…
В PHP можно создать объект, похожий на dict в Python, но с возможностью обращаться через оператор доступа к свойствам. Проще показать:
$mydict = (object) [ # new stdClass
'foo' => 123,
'bar' => fn($x)=> $x + 1
];
$mydict->foo; # = 123
Ну и аналог в JavaScript:
mydict = {
foo: 123,
bar: x => x + 1
}
mydict.foo // = 123
Ну и по привычке я ожидал, что смогу в Python писать так:
mydict = {
'foo': 123,
'bar': lambda x: x + 1
}
mydict.foo # Error
Иногда такое хочется и кажется удобным. Реализовать такой функционал, как оказалось, очень даже просто в пару строк кода:
class StdClass(dict):
__getattr__ = dict.get
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
Все. Мы просто немного расширили стандартный класс dict
и теперь можем творить такие чудеса:
mydict = StdClass({
'foo': 123,
'bar': lambda x: x + 1
})
print(mydict.bar( mydict.foo ))
mydict.buz = 'abc'
Просто, имхо, это сильно приятнее чем писать:
print(mydict['bar']( mydict['foo'] ))
mydict['buz'] = 'abc'