Я хочу создать внутренний декоратор, использующий его внутри моего класса Python, для того, чтобы обернуть операции переключения и переключения селена. Так что я попытался это:Внутренние декораторы в классе Python
class MyPage(object):
# ...
def framed(self, frame_query: str):
def decorator(function):
@functools.wraps(function)
def wrapper(*args, **kwargs):
frame = self.driver.find_element(By.XPATH, frame_query)
self.driver.switch_to.frame(frame)
out = function(*args, **kwargs)
self.driver.switch_to.default_content()
return out
return wrapper
return decorator
# ...
@framed('//myxpath/iframe')
def framed_function(self):
# ...
Но я получаю эту ошибку:
TypeError: framed() missing 1 required positional argument: 'frame_query'
Очевидно, что ожидает 2 параметров, включая себя, но в контексте декоратора он ничего о себе не знает, так что я должен был определить и внутренняя функция внутри'framed_function' делает решение гораздо менее элегантное:
# My workaround
def framed_function(self):
@framed('//myxpath/iframe')
def actual_framed():
#...
actual_framed()
предложение?
Работает, но определенно сложно, когда вы не знаете, как декораторы добавляются к экземпляру объекта (мой отказ), я рассмотрю это чтение, на которое вы ссылались, чтобы больше узнать об этом. – gerosalesc