python:两个版本的def取决于设置

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


我认为你可以用一个装饰师来做这个,如果改变的形式总是相同的话。例如,如果systemX的话,下面将添加None的第一个参数:

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)

然后在系统X上:

1
2
>>> foo(2, 3)
None 2 3

在其他系统上

1
2
>>> foo(1, 2, 3)
1 2 3

免责声明:未经测试的代码,但应该给出一般的想法。


如果进口产品并没有真正称之为你的func,你会让事情变得更困难,你想做的是:

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作为另一个版本的包装器,使用两个单独的名称。