有没有办法做 if-else / try-except 装饰器功能?

Is there a way to do if-else / try-except for decorator functions?

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

在版本 7 中,装饰器的回调被调用 resultcallback()

在版本 8 中,回调被调用 result_callback():

目前我有一个代码可以对库 X 的第 7 版执行类似的操作:

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?

我可以这样做,但它真的很难看,而且如果我必须做出一些更改,我不认为维护同一功能的 2 个副本是可持续的。

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