有没有办法做 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
这个库 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