我有一个在两个平台上运行的程序。每个平台都有一组不同的导入模块。一个平台上的许多def语句需要一个额外的参数来运行其导入集。并非每个def语句都需要更改。
如果这样的事情有效,那将会使事情变得更容易:
if platform_1:
def func(this, that):
else:
def func(self, this, that):
func_body
有没有办法做到这一点?
答案 0 :(得分:3)
我想知道为什么一个函数应该有一个它永远不会使用的参数。修复强制你进入这种情况的周围代码不是更好吗?
然而,有可能......
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
答案 1 :(得分:2)
如果导入实际上没有调用你的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定义为另一个版本的包装器,并使用两个不同的名称。
答案 2 :(得分:2)
我认为如果改变始终是相同的形式,你可以用装饰器做到这一点。例如,如果None
为system
,则以下内容会添加X
的第一个参数:
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
免责声明:未经测试的代码,但应该给出一般的想法。