编写我的装饰器的 pythonic 方式是什么?
What is the pythonic way to write my decorator?
我的 objective 是在我的程序遇到意外行为时引发 SystemExit 并记录错误。
我在做类似的事情:
logger.error('Unexpected behaviour')
raise SystemExit
为了避免在我的代码中重复,我尝试编写一个装饰器来在每次 logger.error 调用时引发 SystemExit:
error = logger.error
def error_from_logger(msg) :
''' Decorator for logger.error to kill the program at the call '''
error(msg)
raise SystemExit
logger.error = error_from_logger
del(error_from_logger)
所以我的问题是:我的装饰器是 pythonic 的吗?如果不是,最好的 pythonic 写法是什么? (我看到有人用@something,但我不明白它的用法)。
谢谢!
正如评论中所提到的,您所做的并不完全是装饰。这将是装饰:
def call_then_exit(func):
def called_and_exited(*args, **kwargs):
func(*args, **kwargs)
raise SystemExit
return called_and_exited
logger = logging.getLogger()
logger.error = call_then_exit(logger.error) # this is the decoration
logger.error("some error has happened") # prints the message and exists
@decorator 只是您在声明函数时使用的语法糖。如果您使用在其他地方声明的 function/method,这对您没有多大用处。
@call_then_exit # this is the decoration
def say_hi():
print('hello')
say_hi() # prints 'hi' and exits
print('did we exit?') # we never reach this
Is my decorator pythonic?
可以说这不是因为打补丁很丑而且它增加了意想不到的行为。更明确地说,您可以制作一个 log_error_and_exit()
函数或使用 logging.setLoggerClass(OurLogger)
注册您自己的日志记录 class 并且可能添加一个 .fatal_error()
方法。但是,我认为您的解决方案是可以的。
我的 objective 是在我的程序遇到意外行为时引发 SystemExit 并记录错误。
我在做类似的事情:
logger.error('Unexpected behaviour')
raise SystemExit
为了避免在我的代码中重复,我尝试编写一个装饰器来在每次 logger.error 调用时引发 SystemExit:
error = logger.error
def error_from_logger(msg) :
''' Decorator for logger.error to kill the program at the call '''
error(msg)
raise SystemExit
logger.error = error_from_logger
del(error_from_logger)
所以我的问题是:我的装饰器是 pythonic 的吗?如果不是,最好的 pythonic 写法是什么? (我看到有人用@something,但我不明白它的用法)。
谢谢!
正如评论中所提到的,您所做的并不完全是装饰。这将是装饰:
def call_then_exit(func):
def called_and_exited(*args, **kwargs):
func(*args, **kwargs)
raise SystemExit
return called_and_exited
logger = logging.getLogger()
logger.error = call_then_exit(logger.error) # this is the decoration
logger.error("some error has happened") # prints the message and exists
@decorator 只是您在声明函数时使用的语法糖。如果您使用在其他地方声明的 function/method,这对您没有多大用处。
@call_then_exit # this is the decoration
def say_hi():
print('hello')
say_hi() # prints 'hi' and exits
print('did we exit?') # we never reach this
Is my decorator pythonic?
可以说这不是因为打补丁很丑而且它增加了意想不到的行为。更明确地说,您可以制作一个 log_error_and_exit()
函数或使用 logging.setLoggerClass(OurLogger)
注册您自己的日志记录 class 并且可能添加一个 .fatal_error()
方法。但是,我认为您的解决方案是可以的。