2016-07-13 72 views
12

Dove sono definiti __file__, __main__, ecc. E come vengono chiamati ufficialmente? __eq__ e __ge__ sono "metodi magici", quindi ora mi riferisco solo a loro come "costanti magiche" ma non so nemmeno se è giusto.Esiste una tabella completa delle "costanti magiche" di Python?

La ricerca su Google non sta davvero rivelando nulla e persino la documentazione di Python non sembra avere un elenco completo di essi dopo la scansione attraverso i livelli delle pagine.

+1

non sono "costanti magiche", quindi non proprio. Alcuni sono relativi alle importazioni: https://docs.python.org/3/reference/import.html#import-related-module-attributes. '__main__' è qui: https://docs.python.org/3/library/__main__.html. Gli attributi dell'oggetto sono nel modello dati: https://docs.python.org/3/reference/datamodel.html – jonrsharpe

+0

Prova a chiamare la funzione 'globals()' e vedi il risultato. – sehrob

+0

Per curiosità, perché vuoi un tavolo simile? È curiosità sapere cosa c'è? Vuoi definire la tua e sentirti preoccupato di poter entrare in conflitto con qualcosa che è già presente? Se il secondo caso, IIRC, tutti i nomi dunder sono riservati dall'interprete e quindi non dovresti definirne di nuovi. Ce ne sono alcuni che vengono usati così frequentemente che è improbabile che il linguaggio li userà mai per uno scopo diverso (ad esempio '__version__') - anche se _could _... In ogni caso, non si dovrebbe assolutamente andare a definire niente di nuovo. – mgilson

risposta

16

Risposta breve: no. Per la risposta più lunga, che ha ottenuto mal di mano, continuate a leggere ...


non esiste una tabella completa di coloro __dunder_names__ (anche non il loro titolo ufficiale!), Per quanto ne sono a conoscenza. Ci sono un paio di fonti:

  • L'unica vera "costante magica" è __debug__: si tratta di un SyntaxError per tentare di assegnare a questo nome. È coperto in the list of constants e menzionato nel contesto di the assert statement.

  • Un altro nome a livello di modulo con uso specifico da una dichiarazione è __all__, che è documentata a fianco the import statement.

  • Ci sono due moduli speciali, documentate nel library reference, che hanno le proprie pagine:

    • __main__ è l'ambiente di alto livello in cui viene eseguito uno script.

    • __future__ è per l'accesso a funzionalità di linguaggio che non sono ancora obbligatori (ad esempio print_function per sostituire l'istruzione print in Python 2).

  • La maggior parte del resto (__name__, __file__, etc.) sono aggiunti ai moduli da parte del sistema di importazione, così sono elencati in the import documentation.

Ci sono anche molti relativi agli oggetti. I metodi di base per l'implementazione del comportamento incorporato (come __eq__ e __ge__, come menzionato) sono elencati in the data model documentation. Ma esistono molti altri nomi più specifici; per esempio, ci sono diversi relativi specificamente alle eccezioni, come __cause__ e __traceback__, in the exceptions documentation.


Si noti che non v'è nulla di particolarmente "magico" sulla maggior parte di questi, sono gli attributi appena regolari e possono essere assegnati a come meglio credi.Tuttavia, sono considerati riservati per i macchinari Python interni, quindi non dovresti aggiungere il tuo; per the language reference on "reserved classes of identifiers":

Qualsiasi uso di __*__ nomi, in qualsiasi contesto, che non segue l'uso esplicitamente documentata, è soggetto a rottura senza preavviso.

Detto questo, ci sono un paio di uso comune che non credo che in realtà sono specificati ovunque nei documenti ufficiali, come __author__ e __version__; vedere per es. What is the common header format of Python files? e What is the origin of __author__? Alcuni hanno lo stato semi-ufficiale tramite PEP-8, ma questo è tutto.


Pochi altri hanno calcato questo percorso, tramite gli sguardi di esso:

+1

Ci sono anche alcuni in [here] (https://docs.python.org/3/library/types.html#types.ModuleType) –

+0

@ MathiasEttinger true, ma sono tutti trattati nel modello dati ('__doc__') o nei documenti di importazione. – jonrsharpe

+0

Quindi, dato che non esiste un elenco completo, c'è almeno da qualche parte (o forse ti piacerebbe fornirglielo) che fornisce solo alcuni dei principali. Come nuovo arrivato a Python, sarebbe sicuramente carino avere una sorta di tabella, anche se incompleta. O sono condannato a giocare a caccia al tesoro? – AlanSTACK