python: возможны ли декораторы для аргументов метода?

#python #methods #arguments #decorator

#python #методы #аргументы #декоратор

Вопрос:

Возможно ли украсить аргументы метода? Что-то вроде:

 class SampleEntity (BaseEntity) :
    def someOperation (self, @Param(type="int", unit="MB")i, str) :
        pass
  

В принципе, я хочу, чтобы разработчик мог указывать метаданные о классе, свойствах, методах, аргументах и т.д., Которые я могу обработать позже. Для класса и методов я мог бы использовать декораторы. Итак, мне было интересно, как это сделать для аргументов метода.

Спасибо, Малыш

Комментарии:

1. какие метаданные? разве вы не можете использовать docstring для этого?

Ответ №1:

Нет, но в Python 3 вы можете использовать аннотации.

 def func(arg: Param(type = 'int', unit = 'MB')):
   pass
  

Аннотации могут содержать любую информацию, которую вы хотите, язык не определяет, что должно туда входить. Вы можете получить к ним доступ с помощью func.__annotations__ dict позже.

Комментарии:

1. Спасибо! Забавно, что БОДРОСТЬ духа — python.org/dev/peps/pep-3107 — говорит, что атрибут вызывается func_annotations , а не __annotations__ . Это устарело? устаревают ли PEPS-файлы? :). Я получал AttributeError и не мог понять, что я делаю неправильно.

2. @letitbee: Я думаю, вам следует по умолчанию сначала проверять ссылку на язык, а позже просматривать PEPS, по крайней мере, для языковых функций, которые уже были реализованы. Аннотации хранились в __annotations__ даже в версии 3.0, поэтому я предполагаю, что они решили изменить это где-то между публикацией PEP и его реализацией.

3. На самом деле, и я цитирую PEP-1, «PEP должен предоставлять краткую техническую спецификацию функции <…>». Хотя, если вы правы, и мы не можем доверять PEPS, мы также не можем доверять PEP-1! 😉

Ответ №2:

Если это для документации, вы могли бы использовать соглашения о docstring, которые обычно используются.

Если это для получения более конкретной информации, которую вы можете позже использовать в своих приложениях, вы могли бы использовать свойства enthought.

Если вы хотите статическую типизацию, вам следует использовать другой язык.

Ответ №3:

Нет. Вы можете декорировать функции и классы, но не параметры.

Комментарии:

1. Тогда каким будет способ решить мою проблему? Должен ли я украсить сам метод, чтобы предоставить метаданные об аргументах?

2. @Litty: Ваша проблема не связана с Python. Это проблема Java или C . Если вы переключите языки, вам не придется делать так много.

Ответ №4:

Вы не можете поместить декоратор в список параметров, он должен быть вокруг функции или класса.

Возможно, вы захотите использовать существующий декоратор в качестве отправной точки для вашего декоратора.

Ответ №5:

Вы можете задокументировать определение функции с помощью аннотаций. Что на самом деле означают аннотации, зависит от вас и кода, использующего ваши функции.

Например:

 def dostuff(f: str, x: "Hula hula!"):
     pass
  

Комментарии:

1. Интересно. Я не знал об этом. 1