web-dev-qa-db-de.com

warum rufen wir print nach dem Import von print_function auf (in Python 2.6)

Um die 3.0-Druckfunktion zu erhalten, führen wir in Python 2.6 Folgendes aus:

from __future__ import print_function

Um die Funktion zu verwenden, rufen wir print () und nicht print_function () auf. Ist das nur eine Inkonsistenz oder gibt es dafür einen guten Grund?

Warum nicht das Folgende:

from __future__ import print
60
H2ONaCl

Der Grund dafür ist, dass Sie beim Importieren aus __future__ wirklich nur ein Flag setzen, das den Interpreter anweist, sich anders zu verhalten als sonst. Im Fall von print_function wird die Funktion print() anstelle der Anweisung zur Verfügung gestellt. Das __future__-Modul ist daher "speziell" oder "magisch" - es funktioniert nicht wie die üblichen Module.

47
kindall

print_function ist eine FeatureName, die nicht mit der eingebauten print-Funktion selbst verwechselt werden kann ..__ Diese Funktion steht in der Zukunft zur Verfügung, sodass Sie die eingebaute Funktion verwenden können, die sie bereitstellt.

Andere Funktionen umfassen:

all_feature_names = [
    "nested_scopes",
    "generators",
    "division",
    "absolute_import",
    "with_statement",
    "print_function",
    "unicode_literals",
]

Es gibt bestimmte Gründe, denn wenn Sie Ihren Code auf die nächst höhere Version migrieren, bleibt Ihr Programm so, dass die aktualisierte Funktion anstelle der __future__-Version verwendet wird. Auch wenn es sich um den Funktionsnamen oder das Schlüsselwort selbst handelt, kann dies zu Verwirrung beim Parser führen.

11
Senthil Kumaran

Einfach. print ist ein Schlüsselwort in Python 2.

Also eine aussage wie

from somewhere import print

wäre ein automatischer SyntaxError in Python 2.

Zulassen (Hardcoding in der Syntax)

from __future__ import print

war die Mühe nicht wert.

4

In Python 3 wurde das Schlüsselwort print vom Aufruf einer Anweisung in den Aufruf einer Funktion geändert.

Anstatt print value zu sagen, müssen Sie jetzt print(value) sagen, oder Sie erhalten eine SyntaxError.

Wenn Sie die Variable import ausführen, wird diese Änderung auch in Python 2 durchgeführt, sodass Sie Programme mit derselben Syntax wie Python 3 schreiben können (zumindest in Bezug auf print).

4
Tim Pietzcker

Minimales Beispiel

>>> print     # Statement.

>>> from __future__ import print_function
>>> print     # Function object.
<built-in function print>
>>> print()   # Function call.

>>>

Wie bereits erwähnt: Wofür wird __future__ in Python verwendet und wie und wann wird es verwendet und wie es funktioniertfrom __future__ sind magische Anweisungen, die die Parson-Syntaxanalyse ändern.

from __future__ import print_function ändert insbesondere print von einer Anweisung in eine integrierte Funktion, wie in der interaktiven Shell oben gezeigt.

Warum funktioniert print(1) ohne from __future__ import print_function in Python 2 

Weil der:

print(1)

wird analysiert als:

print (1)
^^^^^ ^^^
1     2
  1. print-Anweisung
  2. streit

anstatt:

print( 1 )
^^^^^^ ^ ^
1      2 1
  1. print() Funktion
  2. streit

Und:

assert 1 == (1)

wie bereits erwähnt: Python-Tuple-Regel für nachfolgende Kommasyntax

Der Vollständigkeit halber sind alle derzeit verfügbaren verfügbaren -Funktionen:

+------------------+-------------+--------------+----------------------------------------------------+
|     feature      | optional in | mandatory in |                       effect                       |
+------------------+-------------+--------------+----------------------------------------------------+
| nested_scopes    | 2.1.0b1     |          2.2 | PEP 227: Statically Nested Scopes                  |
| generators       | 2.2.0a1     |          2.3 | PEP 255: Simple Generators                         |
| division         | 2.2.0a2     |          3.0 | PEP 238: Changing the Division Operator            |
| absolute_import  | 2.5.0a1     |          3.0 | PEP 328: Imports: Multi-Line and Absolute/Relative |
| with_statement   | 2.5.0a1     |          2.6 | PEP 343: The “with” Statement                      |
| print_function   | 2.6.0a2     |          3.0 | PEP 3105: Make print a function                    |
| unicode_literals | 2.6.0a2     |          3.0 | PEP 3112: Bytes literals in Python 3000            |
| generator_stop   | 3.5.0b1     |          3.7 | PEP 479: StopIteration handling inside generators  |
| annotations      | 3.7.0b1     |          4.0 | PEP 563: Postponed evaluation of annotations       |
+------------------+-------------+--------------+----------------------------------------------------+
0
not2qubit