是否有一种方法来做if-else / try-除了装饰函数?



这个库X有两个版本,7和8。

version 7,装饰器的回调名为resultcallback()

,回调称为result_callback():

目前,我有一个代码做了类似于版本7的库X:

from x import x  # Some sort of decorator library.
@x.resultcallback()
def process_pipeline(func, **kwargs):
with x.get_stream as fin:
func(fin)

我有用户希望只依赖于其中一个版本,并且两个版本都不能只适应版本7或版本8。

是否有一种方法来做一个if-else在装饰器?

我可以这样做,但它真的很丑,我认为如果我必须做一些改变,维护同一个函数的两个副本是不可持续的。

from x import x
if x.__version__.split('.')[0] == '7':
@x.resultcallback()
def process_pipeline(func, **kwargs):
with x.get_stream as fin:
func(fin)
elif x.__version__.split('.')[0] == '8':
@x.result_callback()
def process_pipeline(func, **kwargs):
with x.get_stream as fin:
func(fin)

有没有办法:

if x.__version__.split('.')[0] == '7':
@x.resultcallback()
elif x.__version__.split('.')[0] == '8':
@x.result_callback()
def process_pipeline(func, **kwargs):
with x.get_stream as fin:
func(fin)

或者像

try:
@x.resultcallback()
except:
@x.result_callback()
def process_pipeline(func, **kwargs):
with x.get_stream as fin:
func(fin)

您可以简单地将适当的装饰器分配给单个名称。

if x.__version__.split('.')[0] == '7':
result_callback = x.resultcallback
elif x.__version__.split('.')[0] == '8':
result_callback = x.result_callback

@result_callback
def process_pipeline(func, **kwargs):
with x.get_stream as fin:
func(fn)

你也可以使用from ... import ...语句来写这个,而不用担心实际的版本号。

try:
# Old versions
from x import resultcallback
except ImportError:
# New versions
from x import result_callback as resultcallback