我试图搂着成语 - 如果有的话 - 与Python元编程有关。例如,这出现在序列化器中。
例如,Django REST框架指出你很想做这样的事情,这似乎很简单:
from datetime import datetime
class Comment(object):
def __init__(self, email, content, created=None):
self.email = email
self.content = content
self.created = created or datetime.now()
comment = Comment(email='leila@example.com', content='foo bar')like
然而,在没有任何解释的情况下,他们会在他们的“成语”中展示它是如何完成的,正如我将其称之为,它看起来像这样:
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
我迷失了为什么人们不会让代码看起来更像这样,因为它纯粹是一种设计选择:
class CommentSerializer(serializers.Serializer):
self.email = serializers.EmailField()
self.content = serializers.CharField(max_length=200)
self.created = serializers.DateTimeField()
使用一些合适的getter / setter函数。
我实际看过源代码,无法确定是否有疯狂的方法。实例化时,基于这种方法的“注释”涉及使用魔术方法进行无休止的内省(查看类中声明的内容),许多拜占庭代码形状如下:
class ListSerializer(BaseSerializer):
child = None
many = True
default_error_messages = {
'not_a_list': _('Expected a list of items but got type "{input_type}".'),
'empty': _('This list may not be empty.')
}
def __init__(self, *args, **kwargs):
self.child = kwargs.pop('child', copy.deepcopy(self.child))
self.allow_empty = kwargs.pop('allow_empty', True)
assert self.child is not None, '`child` is a required argument.'
assert not inspect.isclass(self.child), '`child` has not been ins tantiated.'
super(ListSerializer, self).__init__(*args, **kwargs)
self.child.bind(field_name='', parent=self)
def bind(self, field_name, parent):
super(ListSerializer, self).bind(field_name, parent)
self.partial = self.parent.partial
def get_initial(self):
if hasattr(self, 'initial_data'):
return self.to_representation(self.initial_data)
return []
这段代码非常密集,几乎不可能破译。
我的问题是,这只是一次性的,或者是否有一种模式可用于掌握和复制?我很难看到更大的范式或习语。如果有的话,似乎有一种非常依赖的内省使用内省,元类和动态方法来实现风格化的结果,但很难理解如何更普遍地使用该方法。