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

时间:2011-09-09 00:18:57

标签: python

我有一个在两个平台上运行的程序。每个平台都有一组不同的导入模块。一个平台上的许多def语句需要一个额外的参数来运行其导入集。并非每个def语句都需要更改。

如果这样的事情有效,那将会使事情变得更容易:

if platform_1:
   def func(this, that):
else:
   def func(self, this, that):

   func_body

有没有办法做到这一点?

3 个答案:

答案 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)

我认为如果改变始终是相同的形式,你可以用装饰器做到这一点。例如,如果Nonesystem,则以下内容会添加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

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