Является ли питоническим применение декоратора к функции __init__? - PullRequest
2 голосов
/ 01 октября 2019

Натолкнулся на необходимость проверки __init__() args. Мы бы хотели перенести эту логику проверки работоспособности в декоратор.

Я сделал несколько прототипов, кажется, что применение декоратора к __init__() работает:

def my_dec(func):
    def wrapper(*args, **kwargs):
        print('a')
        func(*args, **kwargs)
    return wrapper

class testClass(object):
    @my_dec
    def __init__(self):
        print('b')

Наличие декоратора выше __init__ кажется немного грязным. Но кроме этого, есть ли минус в этом? Что-нибудь непитонное?

Ответы [ 2 ]

4 голосов
/ 01 октября 2019

Да: один из принципов Python - свести к минимуму беспорядок для улучшения читабельности, что и делают оболочки. __init__ по замыслу был предназначен для инициализации переданных параметров - что дает следующие преимущества:

  • Проще понять, с какими параметрами будет работать данный класс, при чтении кода
  • Еслиуказанные обертки обладают важной функциональностью (проверка аргументов и т. д.), они выделяются * на 1010 * лучше и на 1011 * труднее пропустить , чем если бы они были где-то в середине __init__
  • Keras использует две обертки вокруг метода, похожего на когда-то понятный init, поэтому он не является чем-то необычным


Нет: если __init__ включает вызов других методов по любой причине, к ним также будут применены оболочки (и), что может быть крайне нежелательно. Укладка обертки также требует тщательного дизайна. Они оба идут вразрез с принципом явности в Python;это вводит дополнительное распутывание от имени читателя, которого можно избежать с помощью методов класса.

Вердикт : Зависит. В общем нет. Иногда да - может улучшить читаемость.

1 голос
/ 01 октября 2019

Я думаю, что «pythonic» здесь может быть субъективным (и я использую, возможно, слегка), но я считаю, что придерживаюсь более стандартного подхода и проверяю работоспособность в пределах __init__ и продолжаю догадываться до минимума позже при отладке или при работес командой.

Кажется, что-то подобное делает то же самое, но чувствует себя более естественно и за ним легче следовать.

...