[英]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定義為另一個版本的包裝,並使用兩個單獨的名稱。
我認為如果更改始終是相同的形式,則可以使用裝飾器執行此操作。 例如,如果system
為X
,則以下將添加第一個參數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.