J'avais un script python fonctionnel, mais quelque chose devait avoir changé dans python 3.
Par exemple, si je voulais convertir l'argument 1 en minuscules:
import string
print(string.lower(sys.argv[1]))
Il dit que 'module' object has no attribute 'lower'
- OK, je comprends, string
est maintenant un module.
Si je supprime l'importation et que j'écris uniquement string.lower('FOO')
, il se plaint que name 'string' is not defined
.
Alors, quelle est la bonne façon de convertir une chaîne en minuscules?
Vous pouvez utiliser sys.argv[1].lower()
>>> "FOo".lower()
'foo'
lower()
est une méthode d'objets chaîne elle-même.
Le module string
a été modifié dans Python 3, il ne contient plus les méthodes liées aux objets str
, il ne contient désormais que les constantes mentionnées ci-dessous.
Vous pouvez également utiliser str.lower("Mystring")
mais ce n'est pas nécessaire ici car vous pouvez simplement utiliser "Mystring".lower()
.
>>> import string # Python 3
>>> dir(string)
['ChainMap', 'Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
C'est str
pas string
:
>>> str.lower("HELLO")
'hello'
D'où la raison pour laquelle vous obtenez le name 'string' is not defined.
L'erreur est qu'il n'existe actuellement aucune variable dans la portée appelée string
.
La manière correcte orientée objet est:
'FOO'.lower()
Dans votre exemple:
print(sys.argv[1].lower())
Pour ajouter, alors que certaines personnes préfèrent la méthode orientée objet (appelant la méthode de l'objet str), certaines peuvent toujours préférer la méthode plus ancienne - avec des fonctions ou des opérateurs. Cela dépend aussi du problème résolu. (Si vous n'êtes pas d'accord, pensez par exemple à (1.5).__add__(3)
.)
Vous pouvez facilement créer votre propre nom (plus simple) pour la fonction dont vous avez besoin pour le rendre plus lisible. Vous devez seulement vous demander s'il sera lisible (à l'avenir pour vous et maintenant) pour tout le monde:
>>> lower = str.lower
>>> lower('SoMe CaPiTaL LetTerS to Be LoWeRED')
'some capital letters to be lowered'