簡體   English   中英

python:def的兩個版本,具體取決於設置

[英]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定義為另一個版本的包裝,並使用兩個單獨的名稱。

我認為如果更改始終是相同的形式,則可以使用裝飾器執行此操作。 例如,如果systemX ,則以下將添加第一個參數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM