2014-12-17 11 views

risposta

9

Mentre importare * dal modulo futuro è probabilmente pericoloso e dovrebbe essere evitato per i motivi menzionati da John Zwinck, è stato interessante scoprire perché questo non funziona. Funziona in modo diverso rispetto alla consueta sintassi di importazione Python che ti permette di catturare tutto dal modulo usando *.

È possibile vedere cosa succede aprendo Lib/compiler/future.py nella vostra directory di installazione di Python: tutte le dichiarazioni di importazione che importano da __future__ sono gestiti attraverso un parser speciale che consente solo di cercare di importare una delle caratteristiche predefinite. Dal codice sorgente di FutureParser:

features = ("nested_scopes", "generators", "division", 
      "absolute_import", "with_statement", "print_function", 
      "unicode_literals") 

Quindi, fondamentalmente, hai fatto bene a notare che l'importazione da __future__ è un caso particolare che funziona un po 'diverso dal solito processo di importazione Python, ma ci sono buone ragioni per questo.

7

Importare "tutto" dal futuro non è né desiderabile né ragionevole. In effetti, la maggior parte delle volte non dovresti importare *, ma nel caso di __future__ è particolarmente insidioso: quali caratteristiche hai intenzione di ottenere? Sarebbe molto difficile scrivere un programma corretto che funzioni con le versioni future di Python le cui funzionalità non sono ancora note.

+0

Certo, è ovviamente una cattiva idea, ma questa risposta non spiega perché questo errore accade ... – senshin

Problemi correlati