2016-11-25 1 views
3

locals() der Python-Dokumentation sagt:Was macht Pythons Locals()?

Update und ein Wörterbuch gibt die aktuelle lokale Symboltabelle darstellt. Freie Variablen werden von locals() zurückgegeben, wenn sie in Funktionsblöcken, aber nicht in Klassenblöcken aufgerufen werden.

  1. Was in der aktuellen Tabelle lokalen Symbols ist genau?

  2. Ist die lokale Symboltabelle garantiert identisch mit dem Argument dict, wenn locals() am Anfang einer Funktion aufgerufen wird?

    Zum Beispiel, wenn wir das folgende Programm haben:

    def foo(x, y): 
        print(locals() == {'x': 1, 'y': 2}) 
    foo(1, 2) 
    

    Wird es immer ausgegeben True egal welche Plattformen und Python-Implementierungen verwenden wir?

+0

@idjaw Diese Frage erwähnt überhaupt keine * Symboltabelle *. – Cyker

+0

@idjaw FYI Ich möchte Argumente in einer Funktion an eine andere Funktion übergeben, aber ich möchte den Funktionsprototyp zur Lesbarkeit nicht in '(* args, ** kwargs) ändern. Wenn 'locals()' genau das selbe ist wie das Argument dict am Anfang einer Funktion, dann ist das Übergeben von Argumenten sehr einfach. – Cyker

+0

Ihre Frage erneut lesen Ich sehe die Besonderheiten Ihrer Frage. Ich lösche, um Verwirrung zu beseitigen. – idjaw

Antwort

0

Was in der aktuellen Tabelle lokalen Symbols ist genau?

Nun, Sie können selbst einen Blick darauf werfen. Ganz am beginging Ihres Python, Programm, hier ist das, was die Symboltabelle zurück von locals() wie folgt aussieht:

print(locals()) 

Welche Ausgänge:

{'__doc__': None, '__spec__': None, '__package__': None, '__builtins__': 
<module 'builtins' (built-in)>, '__name__': '__main__', '__loader__': 
<class '_frozen_importlib.BuiltinImporter'>, 
'__file__': 'C:\\Users\\$Name$\\Desktop\\script.py'} 

Die Symboltabelle besteht aus einem paar „magischen Variablen“ und einige Informationen über Ihre aktuelle Python-Datei. Wie der Schlüssel __file__, der den Namen Ihrer aktuellen Quelldatei enthält. Die Beschreibung von dem, was die Einheimischen zurückgibt passt so ziemlich die Definition für eine Symboltabelle:

In der Informatik, eine Symboltabelle ist eine Datenstruktur von einer Sprache Übersetzer wie ein Compiler oder Interpreter verwendet, wo jeder Kennung Der Quellcode eines Programms ist mit Informationen zu seiner Deklaration oder seinem Aussehen in der Quelle verknüpft. - Wikipedia: Symbol table

(Hervorhebung von mir)


Ist die lokale Symboltabelle garantiert das gleiche wie das Argument dict, wenn Einheimische() am Anfang einer Funktion aufgerufen wird ?

Welchem ​​die Antwort würde ja. Funktionen haben ihren eigenen Umfang. Und, wie durch den Namen angedeutet, gibt locals() nur lokale Identifizierer für den aktuellen Bereich zurück. Also ein Aufruf an locals() innerhalb einer Funktion, konnte nicht durch den äußeren Umfang eines Programms geändert werden. z.B.

>>> var = 10 # global variable 
>>> locals()['var'] # var is accessible in the current scope 
10 
>>> def func(): 
    print(locals()['var']) # but not in this scope. Python will raise an error 


>>> func() 
Traceback (most recent call last): 
    File "<pyshell#17>", line 1, in <module> 
    func() 
    File "<pyshell#16>", line 2, in func 
    print(locals()['var']) 
KeyError: 'var' 
>>> 

Es ist ein wenig schwer zu verstehen, was in Ihrer zweiten Frage Ihre fragen, so dass ich entschuldige mich, wenn meine Antwort im Zusammenhang nicht. Aber ich glaube deine Frage: Wenn ich locals() am Anfang meiner Funktion, innerhalb meiner Definition, anrufe, wird die dict() von Einheimischen zurückgegeben, die garantiert gleich bleiben?. Wenn dies nicht der Fall ist, aktualisieren Sie Ihre Frage und ich werde versuchen, sie erneut zu beantworten.

+0

Ich bin nicht sicher, ob es einige eingebaute Namen in einem Funktionsumfang außer den Parametern geben wird. Können Sie eine Python-Implementierungsreferenz finden, die besagt, dass ein Funktionsumfang gleich zu Beginn sauber ist? – Cyker

+0

@Cyker Bevor ich antworte, lemme sicher, dass wir auf der gleichen Seite waren. ** Ihre Frage ist, gibt es irgendwelche Namen in den Einheimischen zu Beginn Ihrer Funktion, neben Ihren Parametern **? –

+0

Ja, ich frage, ob es keine ** zusätzlichen Namen gibt. – Cyker