2012-10-14 12 views
5

Ho il seguente codice Python:Python come gestire lo split quando il delimitatore non è presente?

def split_arg(argv): 
    buildDescriptor = argv[1] 
    buildfile, target = buildDescriptor.split("#") 

    return buildfile, target 

Si aspetta una stringa (argv[1]) del modulo buildfile#target e li divide in due variabili con lo stesso nome. Quindi una stringa come "my-buildfile # some-target" verrà interrotta in my-buildfile e , rispettivamente, target-.

A volte però, non ci saranno "#" e target; a volte hai solo "my-buildfile", nel qual caso voglio solo target "" (vuoto).

Come si modifica questa funzione in modo che gestisca le istanze in cui "#" non esiste e restituisce buildfile con un target vuoto?

Attualmente, se mi passate solo il BuildFile, getta un errore:

buildfile, target = buildDescriptor.split("#") 
ValueError: need more than 1 value to unpack 

Grazie in anticipo!

+0

Utilizzare la digitazione anatra, provare a fare ciò che si desidera e rilevare le eccezioni. –

+0

Grazie per il suggerimento, ma cos'è la digitazione anatra? – IAmYourFaja

+0

La digitazione anatra è una delle tecniche di programmazione più adatte per i programmi Python, basta cercare su google "python duck typing". –

risposta

6

primo luogo, mettere il risultato della scissione in un elenco:

split_build_descriptor = buildDescriptor.split("#") 

Poi controllare quanti elementi ha:

if len(split_build_descriptor) == 1: 
    buildfile = split_build_descriptor[0] 
    target = '' 
elif len(split_build_descriptor) == 2: 
    buildfile, target = split_build_descriptor 
else: 
    pass # handle error; there's two #s 
8

userei l'approccio più ovvio:

buildfile, target = buildDescriptor.split("#") if \ 
         "#" in buildDescriptor else \ 
         (buildDescriptor, "") 

Si noti che questo genererà anche un'eccezione quando c'è più di un "#" in buildDescriptor (che è generalmente un BUON cosa!)

2
>>> buildfile, _, target = "hello#world".partition("#") 
>>> buildfile, target 
('hello', 'world') 
>>> buildfile, _, target = "hello".partition("#") 
>>> buildfile, target 
('hello', '') 
+0

+1, .partition() sembra davvero elegante qui (tranne per il dummy var), ma potrebbe comportarsi in modo strano (inosservato) quando c'è più di un "#". – ch3ka

Problemi correlati