1

Lets sagen, ich habe die folgende Funktion:Funktion Anrufer Kraft entscheiden Wert, welche standardmäßig verwendet wird

def myFun(a=None, b=None): 
    print a, b 

Nun rufe ich die Funktion:

myFun("hi") # Case 1 
>>>hi None 

myFun(b="hi") # Case 2 
>>>None hi 

myFun(a="hi") # Case 3 
>>>hi None 

Gibt es eine Möglichkeit, eine Ausnahme zu werfen, wenn die Funktionsaufrufer hat nicht entschieden, welcher Variablen der Wert "hi" zugewiesen ist? Das heißt, ich hätte gerne eine Ausnahme im 1. Fall, aber nicht im 2. und 3. Fall. Ich benutze Python 2.7.

+0

ja, die de Parameter entfernen und arbeiten sie als Keyword-Argumente, dann wird es obligatorisch sein, wenn die Variablen zugewiesen werden, wie Sie und der erste Fall möchten, wird eine Ausnahme ausgelöst –

Antwort

5

In Python3 können Sie keyword-only arguments angeben:

def myFun(*, a=None, b=None): 
    print(a, b) 

myFun('hi') 

TypeError: myFun() takes 0 positional arguments but 1 was given 

In Python2 wirft, wie Ricardo Silveira points out können Sie **kwargs verwenden, um alle Argumente als Schlüsselwortargumente zu erzwingen.

+0

Vielen Dank das war hilfreich! – Ohumeronen

2
def my_fun(**kwargs): 
    a = kwargs.get("a", None) 
    b = kwargs.get("b", None) 
    # have your code here... 

Dann: my_fun("hi") nicht funktionieren sollte ...

+0

Hmm dies nicht werfen eine Ausnahme im ersten Fall. – Ohumeronen

+0

TypeError: my_fun() nimmt genau 0 Argumente (1 gegeben), das ist eine Ausnahme, nur dass du es nicht genau geschrieben hast, aber du kannst es einfach in die Aufrufermethode von my_fun umwandeln –

+0

Sorry, ich verstehe nicht die Ausnahme mit Ihrem Code, aber mit dem Code von unutbu bekomme ich es. Nun, ich denke, das hängt von meiner Python-Version ab. Trotzdem Danke. – Ohumeronen

1

Sie können dem Benutzer tatsächlich erlauben, alle Argumente, die sie möchten, mit ** kwargs bereitzustellen.

def myFun(**kwargs): 
    print kwargs[a] 
    print kwargs[b] 

Dies führt zu einem Fehler, wenn a oder b nicht definiert sind, aber sie sind nicht sehr hilfreich.

Sie können Ihre eigenen Fehler machen, indem Sie prüfen, ob der Wert existiert. Zum Beispiel:

def myFun(**kwargs): 
    if not kwargs.get(a): 
    raise Exception('a is not here!') 
    if not kwargs.get(b): 
    raise Exception ('b is not here!') 
    print kwargs[a], kwargs[b] 
+0

Danke. Ich habe etwas Neues gelernt :-) – Ohumeronen

+0

'NameError: globaler Name 'a' ist nicht definiert ' –