2011-12-15 14 views
6

Ho un'applicazione esistente che si collega a un database. È in esecuzione in Python 2.7.None vs Empty String in Python

L'applicazione è incoerente nel modo in cui utilizza Nessuno e "" per popolare le variabili che non hanno un valore. Voglio renderlo coerente e provare ad aggiornare il codice in un modo o nell'altro.

Pensare come una persona di database penso a nessuno come lo stesso come nulla e potrebbe supporre che sarebbe la scelta giusta per le variabili vuote, ma allora questo causa problemi quando l'applicazione fa cose del genere

if variable.upper() == "X": 
    #Do something 

come questo genera un errore se la variabile è di tipo Nessuno.

posso fare

if variable is not None and variable.upper() == "X": 
    #Do something 

ma questo sembra inutilmente prolisso.

Esiste una best practice per come dovrebbe essere gestita?

+0

Per citare da [The Zen of Python] (http://www.python.org/dev/peps/pep-0020/): Explicit è meglio di implicito. –

risposta

9

si potrebbe tagliare verso il basso sul codice leggermente semplicemente scrivendo

if variable and variable.upper() == "X": 
    #Do something 

Se la variabile è nessuno o vuoto, allora è equivalente a False.

2
if variable and variable.upper() == 'X' 

è un po 'meno prolisso. Tratterà anche None e la stringa vuota nello stesso modo se questo è qualcosa che vuoi

Modifica: Nota che questo ha semantica diversa per l'espressione che hai postato nel modo in cui gestisce stringhe vuote ... cioè nel tuo espressione rhs della e otterrebbero valutato se la variabile è la stringa vuota, ma in questa espressione non sarebbe come la stringa vuota restituisce False

3

se (variable or '').upper() == 'X' o variable and variable.upper() == 'X' sarebbero entrambi abbreviazione, ma non è certamente esattamente come compatto come il codice originale. Temo che non migliorerai molto, comunque.

Si potrebbe fare

def norm(s): 
    return s or '' 

... 
if norm(s) == 'X': 

ma ultimatively non cambierà di molto anche. Forse la distinzione originale non era affatto così incoerente, ma piuttosto molto pragmatica nel contesto?