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?
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.
Je pense que la meilleure façon de le faire est
import six
six.moves.input()
... cela fonctionnera sur 2 et 3.
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
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.
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
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.