2017-06-16 114 views
0

我想了解函數的參數實現,我想在示例中提出一個問題。Python 3中的函數聲明參數

def learningFunction(*entry,fileName=None): 

    if fileName is not None: 

     entry = open(fileName,'r').read() 

    else: 

     pass 

我想要做的是以下;

  • 當將有文件名作爲一個參數的輸入,功能不應該使用輸入參數(例如:learningFunction(fileName="sample.txt")
  • 此外,可以存在僅僅條目變量作爲輸入(例如:learningFunction("stackoverflow")

它應該適用於這兩個例子,但不是在同一時間,例如; (learningFunction("stackoverflow",fileName="sample.txt")

+0

我猜你的意思是功能,而不是方法,在你的例子。儘管如此,你是否可以澄清以下內容*「另外,可以將輸入變量作爲輸入」*。 –

+0

你是對的,它應該是一個**功能**而不是一種方法,我想我會多澄清一點。 –

+0

現在,它實際上起作用。 @SergeBallesta –

回答

0

就個人而言,我會使用命名參數的條目和文件名。 那麼你的代碼看起來是這樣的

def learningFunction(entry=None, filename=None): 
    assert not entry!= None and filename!= None, "only one param please" 
    ... 

但是你可以用你的設置了。 *entry將接受任意數量的參數並將它們存儲爲元組。 空元組的計算結果爲False。

你可以使用這樣的代碼:

def learningFunction(*entry, filename=None): 
    if entry: 
     ... 
    else: 

在這裏,您可以使用斷言,以確保只是一個單一的參數了。

if entry: 
    assert filename == None, "just one param please" 
else: 
    .... 
0

你想要什麼是不可能的。你不能有兩個參數(一個搶佔了所有positionals)定義的函數,然後再用它不適合的情況下,您可以指定這些工作,那就是:

learningFunction("stackoverflow",fileName="sample.txt") 

將是正確的。

可以加邏輯裏面功能體當然是禁止這個。你不能讓Python在調用時拋出一個錯誤,因爲這是完全合法的。

無論您定義的參數是什麼組合,您都無法獲得此功能,如果您需要兩個參數作爲函數,那麼傳遞兩個參數的情況總是可以接受的。

0

當您使用Python3時,您可以使用inspect模塊將註釋函數中的參數驗證外化。例如,這一個將確保只有被調用函數的參數之一已被填充:

def singleparam(func): 
    sig = inspect.signature(func) 
    def wrapper(*args, **kwargs): 
     # controls that only one parameter has been populated 
     if len(sig.bind(*args, **kwargs).arguments) != 1: 
      raise TypeError("Both positional and keyword parameters") 
     return func(*args, **kwargs) # call original function 
    wrapper.__signature__ = sig  # keeps original signature 
    return wrapper 

你可以自己定義你的函數:

@singleparam 
def learningFunction(*entry,fileName=None): 
    ... 

,如果你把它你會得到一個異常作爲learningFunction("stackoverflow",fileName="sample.txt")