2012-10-14 13 views
5

Mam następujący kod Pythona:Python, jak obsługiwać dzielenie, gdy nie występuje ogranicznik?

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

    return buildfile, target 

spodziewa ciąg (argv[1]) formularza buildfile#target i dzieli je na dwie zmienne o tej samej nazwie. Tak więc ciąg taki jak "mój-buildfile # some-target" zostanie rozbity na my-buildfile i jakiś cel docelowy odpowiednio.

Czasami jednak nie będzie "#" i celu; czasami będziesz miał po prostu "mój-buildfile", w takim przypadku chcę tylko targetu na "" (pusty).

Jak zmodyfikować tę funkcję, aby obsłużyć instancje, w których "#" nie istnieje i zwraca plik kompilacji z pustym celem?

Obecnie, jeśli mijam tylko buildfile, zgłasza błąd:

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

Dzięki z góry!

+0

Używaj pisanie kaczką, próbuj robić, co chcesz i łapać wyjątki. –

+0

Dzięki za sugestię, ale co to jest kaczka? – IAmYourFaja

+0

pisanie na kaczce jest jedną z technik programowania najbardziej pasujących do programów w języku Python, wystarczy google dla "pisania kaczek Pythona". –

Odpowiedz

6

Najpierw umieścić wyniku podziału w formie listy:

split_build_descriptor = buildDescriptor.split("#") 

następnie sprawdzić, ile elementów ma:

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

bym użyć oczywiste podejście:

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

Należy zauważyć, że spowoduje to również wyjątek, gdy istnieje więcej niż jeden "#" w instrukcji buildDescriptor (który jest ogólnie DOBRY rzecz!)

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

+1, .partition() wydaje się tutaj bardzo elegancki (z wyjątkiem atrapa var), ale może zachowywać się dziwnie (niezauważalnie), gdy jest więcej niż jedno "#". – ch3ka

Powiązane problemy