Python元编程范式 - 是否有“标准”?

时间:2017-11-29 01:05:20

标签: python metaprogramming

我试图搂着成语 - 如果有的话 - 与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 []

这段代码非常密集,几乎不可能破译。

我的问题是,这只是一次性的,或者是否有一种模式可用于掌握和复制?我很难看到更大的范式或习语。如果有的话,似乎有一种非常依赖的内省使用内省,元类和动态方法来实现风格化的结果,但很难理解如何更普遍地使用该方法。

0 个答案:

没有答案