[英]python: two versions of def depending on setting
我有一个在两个平台上运行的程序。 每个平台都有一组不同的导入模块。 一个平台上的许多def语句都需要一个附加参数才能与其导入集合一起运行。 并非每个def语句都需要更改。
如果像这样的事情行得通,那将使事情变得更容易:
if platform_1:
def func(this, that):
else:
def func(self, this, that):
func_body
有什么办法吗?
我想知道为什么一个函数应该有一个它从不使用的参数。 修复周围的迫使您进入这种情况的代码会更好吗?
尽管如此,还是有可能...
def narcissist(func):
def wrapper(self,*args,**kwargs):
return func(*args,**kwargs)
return wrapper
def identity(func):
return func
if platform_1:
modify_args=identity
else:
modify_args=narcissist
@modify_args
def func(this,that):
func_body
如果导入实际上没有调用func
,那么您会使自己变得更难了,并且您想这样做:
def func( self, this, that ):
if platform_1:
# do something with just this and that, ignoring self
import_1.doSomething( this, that )
else:
# do something with self, this, that
import_2.doSomething( self, this, that )
如果特定于平台的代码正在调用您的func,则可以考虑将一个版本的func定义为另一个版本的包装,并使用两个单独的名称。
我认为如果更改始终是相同的形式,则可以使用装饰器执行此操作。 例如,如果system
为X
,则以下将添加第一个参数None
:
def multiplatform(function):
if system is X:
def wrapper(*args, **kargs):
return function(None, *args, **kargs)
else:
def wrapper(*args, **kargs):
return function(*args, **kargs)
return wrapper
@multiplatform
def foo(first, second, third):
'''first should not be given on platform X'''
print(first, second, third)
然后在系统X
:
>>> foo(2, 3)
None 2 3
在其他系统上
>>> foo(1, 2, 3)
1 2 3
免责声明:未经测试的代码,但应给出总体思路。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.