2016-08-28 1 views
0

J'ai découvert que je ne peux pas utiliser l'argument flush dans la nouvelle fonction d'impression si j'utilise Python 2.7.11. Je l'ai utilisé:Comment importer la version la plus récente de la fonction d'impression dans Python 2.7.x?

from __future__ import print_function 

print('Hello', flush=True) 

mais il se plaint avec l'erreur:

Traceback (most recent call last): 
    File "print_future.py", line 3, in <module> 
    print('Hello', flush=True) 
TypeError: 'flush' is an invalid keyword argument for this function 

Après avoir regardé the documentation for print j'ai découvert que cela ne fonctionne pas, même si elle est un argument. Mon inférence est que cela ne fonctionne pas parce que flush n'a été ajouté que dans la version 3.3, donc l'instruction spéciale from __future__ import est probablement l'importation d'une ancienne version de la fonction. Les commentaires suggèrent qu'il utilise 2.7.11 mais je ne comprends pas pourquoi il le fait.

J'ai vu Need Python 3.4 version of print() from __future__, dont la réponse enveloppe simplement print et ajoute manuellement le paramètre flush. Même si cela fonctionne, il semble que ce soit plus un problème que de s'attaquer au vrai problème, que nous n'avons pas la version la plus récente de l'impression.

Existe-t-il un moyen d'importer des versions spécifiques de fonctions Python (je veux utiliser la fonction Python 3.5 print, en particulier) pour mon script Python actuel? Si ce n'est pas possible, pourquoi pas? Il semble (étonnamment) qu'il n'est pas clair pour les gens comment ma question est différente même si je l'ai écrit. Je vais le dire différemment.

  1. Il semble que mon problème est d'importer la fonction python à laquelle je ne m'attendais pas (puisqu'elle ne trouve pas l'argument flush). Par conséquent, le plus naturel et la première chose que j'aimerais faire et savoir, c'est quelle fonction d'impression importe-t-elle. Les commentaires suggèrent son utilisation de 2.7.11 mais je ne comprends pas pourquoi c'est ce qu'il fait.
  2. Je comprends que l'instruction from from modifie le fonctionnement de mon compilateur. Il semble que j'ai supposé que puisque c'était une déclaration future, il a également apporté la fonction d'impression d'une future version. Il semble que cela ne change que le comportement de mon interprète. Si j'étais capable de voir quelle fonction d'impression utiliser, je saurais que ce n'est pas importer une fonction d'une future version, mais seulement agir comme un futur interpréteur python. C'est ce qu'il semble, mais je ne sais pas à coup sûr et je voudrais savoir à coup sûr ce qui se passe.
  3. Enfin et surtout, n'y a-t-il pas un moyen naturel d'importer les futures fonctions python dans mon script Python actuel? Je veux utiliser l'instruction d'impression python 3.5, n'est-il pas possible d'utiliser cette fonction en dehors du fait que le compilateur se comporte comme un futur interpréteur python mais se comporte également comme une future version de python? C'était (au moins pour moi) contre-intuitif que l'analyseur agisse comme un futur python mais agisse toujours comme un 2.7.11. La solution que je veux n'est pas un wrapper mais une importation du python récent. Si ce n'est pas possible, alors une réponse à ma question devrait expliquer pourquoi ce n'est pas possible.
+2

Lorsque vous 'd'importation future print_function' vous obtenez la version 2.7.11 de la fonction d'impression. Il ne lit aucun code python3; il n'obtient pas une version de n'importe quel python 3. Vous ne pouvez pas importer le print python3 intégré dans python2. La seule solution correcte, si vous avez besoin de "flush" est d'utiliser wrapper: d'où le doublon. –

+2

Vous avez encore posé la même question, le fait que vous l'ayez lié ne fait pas beaucoup de différence. Si c'est la réponse, c'est la réponse; Si vous ne comprenez pas pourquoi, considérez un commentaire, et si vous en avez besoin d'un autre, considérez une prime. – jonrsharpe

+1

@jonrsharpe Je n'ai pas posé la même question. J'ai même écrit quelle est la différence. D'abord j'ai déjà dit qu'une solution avec un wrapper n'est pas une solution à ma question. Ma question est d'importer essentiellement l'instruction print de python 3.4 ou plus. Je comprends que la déclaration future change juste comment mon python analyse mon fichier au moment de la compilation, mais est-il impossible de l'utiliser pour utiliser la fonction d'impression que je demande? J'ai aussi demandé comment vérifier la version de la fonction d'impression, je voudrais savoir et vérifier cela. Si la réponse est que vous ne pouvez pas le faire avec un wrapper même si vous utilisez le futur, je le ferais .. –

Répondre

1
  1. its importing the python function that I am not expecting

    Je ne vois pas pourquoi, c'est la version de printthat's documented in 2.7.x.

    which print function is it importing.

    La version fournie avec 02/07/11, qui est la version qui a été introduit dans la version 3.0 (voir PEP-3105).

    The comments suggest its using 2.7.11 but I don't understand why its doing this

    ... parce que c'est la version de Python que vous utilisez? from __future__ import ... ne cherche pas sur votre ordinateur pour d'autres implémentations, il utilise celui qui est fourni avec la version de Python que vous utilisez. Si vous y réfléchissez, c'est inévitable, car sinon les importations futures échoueraient sur les machines qui n'ont pas 3.x installé.

  2. La majorité de ce fait me peu de sens, mais:

    I assumed that since it was a future statement it also brought in the print function from a future release.

    C'est exactement ce qu'il fait. Vous ne pouvez pas choisir quelle version future, cependant. Vous obtenez la version prévue pour la publication au moment où elle a été ajoutée au __future__.

  3. is there not a natural way to import future python functions to my current python script?

    Oui, et c'est la façon que vous utilisez, aussi longtemps que cette fonctionnalité est prise en charge dans __future__.

    is it not possible to use that function

    pas la version 3.3 vers le bas dans la version de Python que vous utilisez, non *. Si vous voulez la fonctionnalité offerte par les versions plus récentes de Python, utilisez une version plus récente de Python. 2.x est à court de route.

    It was (at least to me) counter intuitive to have the parser act like future python but still act like a 2.7.11

    Ce n'est pas "[action] comme un 2.7.11". Il utilise la fonction d'impression de 3.x plutôt que la déclaration d'impression de 2.x. Si vous essayez d'print 'hello' après l'importation de print_function, vous obtiendrez un SyntaxError comme vous le feriez dans 3.x.

    * en supposant que vous ne prévoyez pas d'entrer dans le piratage de votre installation