Использование ** kwargs в python hook __prepare__ - PullRequest
0 голосов
/ 01 октября 2018

Я не могу понять из документации Python, как можно использовать kwargs для ловушки __prepare__.

Как только пространство имен класса заполнено выполнением тела класса, объект классасоздается путем вызова metaclass(name, bases, namespace, **kwds) (дополнительные ключевые слова, переданные здесь, совпадают с ключевыми словами, переданными в prepare ).

Значит ли это, что после заполнения пространства имен класса мы можемиспользовать эти ключевые аргументы, чтобы добавить дополнительные атрибуты, доступные классу?Если да, то как и где мы можем передать значения этому, чтобы он заполнялся различными атрибутами на основе некоторого условия, например, после вызова класса 1011 * после заполнения пространства имен класса должен быть неявным.

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете передать аргументы ключевого слова в конструктор метакласса из оператора class.Это не очень полезно, кроме как для того, чтобы произвести впечатление на людей темными возможностями Python, с которыми вы знакомы.

Ключевые слова передаются в __prepare__, __new__ и __init__, хотя, если вы только переопределяете__new__, ни __init__, ни __prepare__ не будут жаловаться на неожиданные дополнительные аргументы.

class Meta(type):
    def __new__(cls, name, bases, namespace, **kwargs):
        print("Got keywords in __new__: {}".format(kwargs))
        return super().__new__(cls, name, bases, namespace)

    def __prepare__(name, bases, **kwargs):
        print("Got keywords in __prepare__: {}".format(kwargs))
        return {}

class Klass(metaclass=Meta, key1=1, key2="fred"):                   # keywords used here!!!!
    pass

Вам не нужно использовать синтаксис **kwargs для перехвата аргументов.Вы можете назвать их явно, если хотите (хотя они могут передаваться только как ключевые слова, а не как позиционные аргументы).

...