#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