python: two versions of def depending on setting
我有一个在两个平台上运行的程序。每个平台都有一组不同的导入模块。一个平台上的许多def语句需要一个额外的参数来运行其导入集。并非每个def语句都需要更改。
如果这种方法奏效,将使事情变得更容易:
1 2 3 4 5 6 | if platform_1: def func(this, that): else: def func(self, this, that): func_body |
有什么办法吗?
我想知道为什么一个函数应该有一个从未使用过的参数。修复迫使您进入这种情况的周围代码不是更好吗?
然而,这是可能的…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 3 4 5 6 7 8 9 10 11 12 13 | 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) |
然后在系统
1 2 | >>> foo(2, 3) None 2 3 |
在其他系统上
1 2 | >>> foo(1, 2, 3) 1 2 3 |
免责声明:未经测试的代码,但应该给出一般的想法。
如果进口产品并没有真正称之为你的
1 2 3 4 5 6 7 | 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作为另一个版本的包装器,使用两个单独的名称。