最近的一些Python心得点
都是一些零散的东西,但是知识就是这么零散的积累起来的。
一、用dict的setdefault来给字典赋默认值,而不是去写if key not in:
二、批量生成拥默认值的dict,可以考虑使用defaultdict,这样的dict的任何key都是有自己的默认值的
三、给类设置一个__slot__ 属性会导致实例化时不会自动分配 __dict__而只能设置__slot__中声明的属性 ,这样的小技巧可以用在那些写满了__getattr__的类中,
但是这东西有个奇怪的语法问题,就是你这样写是会报告语法错误的
但是你这么写就居然没问题
所以这东西坑还是挺大的(具体的原因涉及到Python的属性查找过程,满大街都有文档),不要轻易的尝试比较好
一、用dict的setdefault来给字典赋默认值,而不是去写if key not in:
res = {}
for i in music_tag_source:
tag = res.setdefault(i.get('music_id'), [])
tag.append(i.get(music_tag))
二、批量生成拥默认值的dict,可以考虑使用defaultdict,这样的dict的任何key都是有自己的默认值的
from collections import defaultdict
res = defaultdict(list)
for i in music_tag_source:
res[i.get('music_id')].append(i.get(music_tag))
三、给类设置一个__slot__ 属性会导致实例化时不会自动分配 __dict__而只能设置__slot__中声明的属性 ,这样的小技巧可以用在那些写满了__getattr__的类中,
class Foo(object):
__slots__ = {'a', 'b'}
if __name__ == '__main__':
bar = Foo()
bar.a = 1
try:
bar.c = 2
except AttributeError as e:
raise Excption('cannot set attrib c') from e
但是这东西有个奇怪的语法问题,就是你这样写是会报告语法错误的
class Foo(object):
__slots__ = {'a', 'b'}
def __init__(self):
self.c = 1
但是你这么写就居然没问题
class Foo(object):
__slots__ = {'a', 'b'}
def __getattr__(self, item):
if item == 'c':
print('get_c')
return 'hh'
if __name__ == '__main__':
bar = Foo()
bar.a = 1
print(bar.c)
所以这东西坑还是挺大的(具体的原因涉及到Python的属性查找过程,满大街都有文档),不要轻易的尝试比较好
评论
发表评论