2016-11-21 4 views
1

Wenn ich die Liste der Städte als Variable übergebe, wird die Aufgabe wie erwartet abgeschlossen.Python - Argumente sauber übergeben

def count_top_rt(tweet_set): 
    for tweet in tweet_set: 
     print(tweet) 

tweet_set = ["Sydney", "London", "Paris"] 
print(tweet_set) 

Wenn ich mis-Typ das Argument Name in der Funktionsdefinition, dann ist die Aufgabe noch vollständig, da das tweet_set Variable ist global.

def count_top_rt(mis_typed_arguament): 
    for tweet in tweet_set: 
     print(tweet) 

tweet_set = ["Sydney", "London", "Paris"] 
print(tweet_set) 

Es fühlt sich an, als ob das Argument nicht richtig übergeben wird, ist falsch. Ich habe zwei Fragen:

  • In der ersten Version, ist das Argument 'richtig' übergeben?
  • Wie kann ich sicherstellen, dass das Argument korrekt übergeben wird?
+5

Verwenden Sie niemals denselben Namen für eine globale Variable wie für eine lokale Variable. Dann passiert dieses Problem nie. – kindall

+0

Wenn Sie PyCharm oder eine ähnliche IDE verwenden, wird es Ihnen sagen, wenn Sie dies automatisch tun. – Alex

+1

@Kindall Das Problem in der zweiten Funktion ist nicht, dass er den gleichen Namen für eine globale und lokale verwendet, es ist, dass die 'for' Schleife nicht die lokale Variable verwendet, die es soll. – Barmar

Antwort

3

Wird das Argument 'richtig' übergeben?

Ja, das Argument wird im ersten Beispiel korrekt übergeben: Ihre Routine hängt nur vom Eingabeparameter ab.

Was sind die Möglichkeiten

In der modularen Philosophie, Sie nicht effektiv schützen gegen dieses Problem: Ihre Funktion ist nicht erlaubt über alles extern zu wissen. Dies ist, wo "pure" modulare Programmierung und Python-Features ein wenig im Widerspruch stehen.

Als Programmierer ist die Verwendung von Variablennamen, die nicht kollidieren, die beste Möglichkeit, dies sicherzustellen. Ändern Sie in diesem Fall den Namen tweet_set im Testtreiber (Ihr Hauptprogramm) in einen anderen Namen. Verwenden Sie einen Namen, der unwahrscheinlich in einer Funktion wie TEST_DRIVER_tweet_set angezeigt wird, wenn das ein ständiger Testfall ist.

Programmierpraktiken

können Sie die Suchfunktion in Ihrem Editor verwenden, um alle Vorkommen der einzelnen Namen zu markieren. Wenn Sie jeden Parameter und Variablennamen der Reihe nach markieren und "alle finden", können Sie sehen, welche nicht richtig eingegeben wurden.

Erweiterte Technik ... nur so können Sie für „eines Tages“ wissen ...

Es gibt Python-Funktionen, die eine Funktion in den Stapel aussehen lassen, den Stapelrahmen der nächsten Funktion greifen (die eine, die diese aufgerufen hat), und überprüfen Sie ihre aktiven Variablen.Wenn Sie das wirklich wirklich tun müssten, könnten Sie Ihre eigenen Parameternamen gegen Variablennamen in jedem Stapelrahmen bis hin zum Hauptprogramm im Betriebssystem überprüfen lassen.

In seltenen Fällen ist dies sinnvoll.

2

Es gibt eine einfache Möglichkeit zu überprüfen, dass:

>>> def count_top_rt(tweet_set): 
...  print(id(tweet_set)) 
...  for tweet in tweet_set: 
...    print(tweet) 

>>> tweet_set = ["Sydney", "London", "Paris"] 
>>> count_top_rt(tweet_set) 
1951490534472 
Sydney 
London 
Paris 
>>> id(tweet_set) 
1951490534472 

>>> tweet_set2 = ["Sydney", "London", "Paris"] 
>>> count_top_rt(tweet_set2) 
1951490565832 
Sydney 
London 
Paris 
>>> id(tweet_set2) 
1951490565832 

wie Sie sehen können, wenn eine Variable als Variable übergeben wird, die lokale Variable ein reference es wird, egal, was ist der Name des Globalen. Das liegt daran, dass der Interpreter zuerst zum lokalen Stack geht, um nach der Variablen zu suchen (der Grund, dass es sich um eine Referenz handelt, ist das Verhalten der Parameter der Funktionen), nur dann, wenn er sich auf die Globals bezieht.

1

Der beste Weg, dies zu verhindern, ist die Vermeidung globaler Variablen. Setzen Sie Ihren gesamten Code in Funktionen und Klassen.

def count_top_rt(tweet_set): 
    for tweet in tweet_set: 
     print(tweet) 

def main(): 
    tweet_set = ["Sydney", "London", "Paris"] 
    count_top_rt(tweet_set) 

main() 

Dies wird ein NameError werfen, wenn Sie das Argument Namen in der Definition von count_top_rt falsch schreiben.

Verwandte Themen