2013-08-25 14 views
12

Czy nie można ustawić wartości domyślnej w pakiecie flag w programie Go? Na przykład w pakiecie flagę można napisać następującą linię:pakiet flag w Go - czy zawsze muszę ustawić domyślną wartość?

filename := flag.String("file", "test.csv", "Filename to cope with") 

w powyższym kodzie, nie chcę koniecznie ustawić wartość domyślną, która jest test.csv w tym przypadku, a zamiast tego zawsze sprawiają, że użytkownicy określić własną nazwę pliku, a jeśli nie jest określona, ​​chcę spowodować błąd i zamknąć program.

Jeden drodze wpadłem na to, że najpierw sprawdzić wartość filename po zrobieniu flag.Parse() i jeśli ta wartość jest test.csv to mam program wychodzi z odpowiednim komunikatem o błędzie. Nie chcę jednak pisać takiego zbędnego kodu, jeśli można go uniknąć - a nawet jeśli nie, chciałbym usłyszeć lepszy sposób na poradzenie sobie z tym problemem.

można zrobić tych rodzaju operacji w moduł Pythona argparse przy okazji - po prostu chcą zaimplementować coś podobnego, jeśli mogę ...

Również mogę realizować oba argumenty krótkich i długich (innymi słów zarówno argumentu -f i -file?) w pakiecie flag?

Dzięki.

+0

Proszę zadać tylko jedno pytanie na pytanie. – Kissaki

Odpowiedz

16

Myślę, że to idiomatyczne zaprojektowanie wartości flag w taki sposób, który implikuje "nieobecność", gdy jest równa zeru ich odpowiednich typów. Na przykład:

optFile := flag.String("file", "", "Source file") 
flag.Parse() 
fn := *optFile 
if fn == "" { 
     fn = "/dev/stdin" 
} 
f, err := os.Open(fn) 
... 

Ad 2. Pytanie: IINM pakiet flag projektem nie rozróżnia -flag i --flag. IOW, możesz mieć zarówno -f i --file w zestawie flag i napisać dowolną wersję - lub -- przed obu f i file. Jednak biorąc pod uwagę inną zdefiniowaną flagę -g, pakiet flag będzie , a nie rozpoznaje -gf foo jako wartość średnią z -g -f foo.

+0

Ah, nie wymyśliłem sposobu na wykorzystanie pustej przestrzeni, dzięki! – Blaszard

+4

Czy pakiet 'flag' zapewnia sposób sprawdzenia, czy flaga jest ustawiona? Nie mówię o wartościach domyślnych ani żadnych wartościach. Mam na myśli to, czy flaga jest obecna w linii poleceń. – Kiril

+1

@Kiril, możesz użyć funkcji [Odwiedź stronę] (https://godoc.org/flag#Visit). –

5

Kiedy mam flagę, która nie może mieć wartości domyślnej, często używam wartości REQUIRED lub czegoś podobnego. Uważam, że to sprawia, że ​​--help jest łatwiejszy do odczytania.

Co do tego, dlaczego nie został upieczony, podejrzewam, że po prostu nie uznano go za wystarczająco ważny. Ustawienie domyślne nie pasuje do każdej potrzeby. Jednak flaga --help jest podobna; nie pasuje do każdej potrzeby, ale jest wystarczająco dobre przez większość czasu.

Nie oznacza to, że wymagane flagi to zły pomysł. Jeśli jesteś wystarczająco namiętny, pakiet flagutil może być przyjemny. Owiń bieżący api flag, zwróć błąd, opisując brakującą flagę i dodaj RequiredInt i RequiredIntVar itd. Jeśli okaże się przydatny/popularny, może zostać scalony z oficjalnym pakietem flag.

+0

Dzięki za pakiet 'flagutil'. Dam ci szansę. – Blaszard

Powiązane problemy