web-dev-qa-db-fra.com

Utilisation de input / raw_input dans python 2 et 3

Je voudrais définir une invite utilisateur avec la question suivante:

save_flag is not set to 1; data will not be saved. Press enter to continue.

input() fonctionne en python3 mais pas en python2. raw_input() fonctionne en python2 mais pas en python3. Existe-t-il un moyen de le faire pour que le code soit compatible avec les deux python 2 et python 3?

39
218

Liez raw_input À input dans Python 2:

try:
    input = raw_input
except NameError:
    pass

Maintenant, input renverra une chaîne dans Python 2 également.


Si vous utilisez six pour écrire du code compatible 2/3 alors six.input() il pointe vers raw_input() dans Python 2 et input() dans Python 3.

51
Ashwini Chaudhary

Je pense que la meilleure façon de le faire est

import six

six.moves.input()

... cela fonctionnera sur 2 et 3.

7
jdborg

Mise à jour: Cette méthode ne fonctionne que si vous avez une future installation et les réponses ci-dessus sont bien meilleures et plus généralisables.

De ce cheatsheet il y a une autre méthode qui semble plus propre:

# Python 2 and 3:
from builtins import input
5
emschorsch

Vous pouvez écrire votre code en python2 et utiliser futurize ou en python3 et utiliser pasteurize . Cela élimine la complexité de la réflexion sur le code compatible et garantit les bonnes pratiques.

Concernant cette question spécifique

from builtins import input

C'est exactement ce que produisent les scripts ci-dessus.

1
gbonetti

Chargez explicitement la fonction:

from builtins import input

Ensuite, vous pouvez utiliser input() en python2 ainsi qu'en python3.

Vous devrez peut-être installer la dépendance:

pip install future

1
AlexG

En effet, In python 2, raw_input() accepte tout ce qui est donné à stdin, sous forme de chaîne, où as input() préserve le type de données du donné (c'est-à-dire si l'argument donné est de type int, il restera comme int uniquement, mais ne sera pas converti en string comme dans le cas de la fonction raw_input()). Autrement dit, lorsque input() est utilisé, il prend les arguments fournis dans stdin comme chaîne et les évalue. Et cette évaluation convertit l'argument en type correspondant.

# Python 2.7.6
>>> a = raw_input("enter :- ")
enter :- 3
>>> type(a)     # raw_input() converts your int to string
<type 'str'>
>>> a = input("enter :- ")
enter :- 3
>>> type(a)    # input() preserves the original type, no conversion     
<type 'int'> 
>>>

Par conséquent, lors de l'utilisation de input() dans Python 2, l'utilisateur doit être prudent lors de la transmission des arguments. Si vous passez une chaîne, vous devez la passer avec quote (puisque python reconnaît les caractères à l'intérieur des guillemets comme une chaîne). Sinon NameError sera jeté.

 >>> a = input("enter name :- ")
 enter name :- Derrick
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<string>", line 1, in <module>
 NameError: name 'Derrick' is not defined
 >>> a = input("enter name :- ")
 enter name :- 'Derrick'
 >>> a
 'Derrick'

Alors que si vous utilisez raw_input(), vous n'avez pas à vous soucier du type de données en passant l'argument comme tout ce qu'il accepte comme chaîne. Mais oui, dans votre code, vous devez vous occuper de la conversion de type appropriée.

Pour éviter ce soin supplémentaire nécessaire pour input() dans Python 2, il a été supprimé dans Python 3. Et raw_input() a été renommé input() dans Python 3. La fonctionnalité de input() from Python 2 n'est pas plus dans Python 3. input() dans Python 3 sert ce que raw_input() servait dans Python 2.

Cet article pourrait être utile pour une compréhension détaillée.

1
Pabitra Pati