2013-05-20 18 views
9

ho avuto uno script python di lavoro, ma qualcosa deve essere cambiato in Python 3.string.lower in Python 3

Per esempio, se ho voluto convertire argomento 1 in caratteri minuscoli:

import string 
print(string.lower(sys.argv[1])) 

si dice che 'module' object has no attribute 'lower' - OK, ho capito, string è un modulo ora.

Se rimuovo l'importazione e scrivo solo string.lower('FOO'), si lamenta che name 'string' is not defined.

Quindi qual è il modo corretto per convertire una stringa in minuscolo?

+0

Sì, non c'è 'variabile STRING' nel secondo esempio. Allora, cosa vuoi convertire? – squiguy

+0

Perché non 'sys.argv [1] .lower()'? –

+0

Ah, mio ​​errore. Non ho notato che la documentazione che ho trovato da google search era per la versione 2.7 – Axarydax

risposta

11

È possibile utilizzare sys.argv[1].lower()

>>> "FOo".lower() 
'foo' 

lower() è un metodo di oggetti stringa stessa.

string modulo è stato modificato in Python 3, non contiene più i metodi relativi agli oggetti str, ora contiene solo le costanti indicate di seguito.

È inoltre possibile utilizzare str.lower("Mystring") ma non è necessario qui, poiché è possibile utilizzare semplicemente "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'] 
+0

o 'str.lower (sys.argv [1])' – Elazar

+2

@Elazar Mentre funziona ed è istruttivo su come funzionano i metodi, è un modo terribile per scrivere quello – delnan

+1

@delnan Sono d'accordo - è solo più simile al codice originale in questione. – Elazar

4

non string E 'str:

>>> str.lower("HELLO") 
'hello' 

qui la ragione viene visualizzato l'errore name 'string' is not defined. è che attualmente non esiste una variabile di portata chiamato string.

+1

Questo funziona come una conseguenza di come funzionano i metodi, ma non è un modo ovvio per chiamare un metodo (che sarebbe "HELLO" .lower() '). – delnan

+0

@delnan Sono d'accordo, ma è il più vicino al codice originale dell'OP e risponde direttamente alla sua domanda sul perché 'string.lower' non funzionava. – HennyH

+1

Non penso che risponda alla domanda, perché 'str.lower (" HELLO ")' funziona sia in Python 2.x ** che in ** Python 3.x, e la domanda è perché 'string.lower (" CIAO ")' non funziona in 3.x. –

3

L'oggetto orientato modo corretto è:

'FOO'.lower() 

Nel tuo esempio:

print(sys.argv[1].lower()) 
+0

La domanda è se il * modo orientato agli oggetti * è sempre quello corretto;) – pepr

2

Per aggiungere, mentre alcune persone preferiscono il modo orientato agli oggetti (chiamando il metodo dell'oggetto str) , alcuni potrebbero ancora preferire il vecchio modo - con funzioni o operatori. Dipende anche dal problema che si sta risolvendo. (Se non siete d'accordo, pensate per esempio a (1.5).__add__(3).)

È possibile creare facilmente il proprio nome (più semplice) per la funzione che è necessario renderlo più leggibile. Hai solo dovrebbe pensare se sarà leggibile (in futuro per voi e ora) per tutti:

>>> lower = str.lower 
>>> lower('SoMe CaPiTaL LetTerS to Be LoWeRED') 
'some capital letters to be lowered'