флаг пакета в Go - нужно ли всегда устанавливать значение по умолчанию?

Можно ли не устанавливать значение по умолчанию в пакете флагов в Go? Например, в пакете флагов вы можете написать следующую строку:

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

В приведенном выше коде я не хочу обязательно устанавливать значение по умолчанию, которое в данном случае равно test.csv, и вместо этого всегда заставляю пользователей указывать собственное имя файла, и если оно не указано, я хочу вызвать ошибку и выйти из программы.

Один из способов, который я придумал, заключается в том, что я сначала проверяю значение filename после выполнения flag.Parse(), и если это значение равно test.csv, то программа завершается с соответствующим сообщением об ошибке. Однако я не хочу писать такой избыточный код, если от него можно обойти - и даже если это невозможно, я бы хотел услышать здесь лучший способ справиться с проблемой.

Кстати, вы можете выполнять такие операции в модуле Python argparse - я просто хочу реализовать то же самое, если смогу ...

Кроме того, могу ли я реализовать как короткие, так и длинные аргументы (другими словами, как -f, так и -file аргумент?) В пакете флагов?

Спасибо.


person Blaszard    schedule 25.08.2013    source источник
comment
Пожалуйста, задавайте только один вопрос на вопрос.   -  person Kissaki    schedule 25.08.2013


Ответы (2)


Я думаю, что идиоматично проектировать значения флагов таким образом, чтобы подразумевать «отсутствует», когда они равны нулевому значению их соответствующих типов. Например:

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

Второй вопрос: IINM, пакет флагов по дизайну не различает -flag и --flag. IOW, вы можете иметь как -f, так и --file в вашем установленном флаге и писать любую версию - или -- перед обоими f и file. Однако, учитывая другой определенный флаг -g, пакет флага не распознает -gf foo как эквивалент -g -f foo.

person zzzz    schedule 25.08.2013
comment
Предоставляет ли пакет flag способ проверить, установлен ли флаг? Я не говорю о значениях по умолчанию или об отсутствии значений. Я имею в виду, присутствует ли флаг в командной строке. - person Kiril; 15.05.2014
comment
@Kiril, вы можете использовать опцию Bool. Если его значение истинно, то флаг установлен. Пример - person Rewanth Tammana; 24.09.2019

Когда у меня есть флаг, который не может иметь значение по умолчанию, я часто использую значение REQUIRED или что-то подобное. Я считаю, что это упрощает чтение --help.

Что касается того, почему это не было сделано, я подозреваю, что это просто не было сочтено достаточно важным. Значение по умолчанию не подходит для всех нужд. Однако флаг --help похож; он не подходит для всех нужд, но в большинстве случаев его вполне достаточно.

Это не значит, что требуемые флаги - плохая идея. Если вы достаточно увлечены, пакет flagutil может быть неплохим. Оберните текущий flag api, заставьте Parse вернуть ошибку, описывающую отсутствующий флаг, и добавьте RequiredInt и RequiredIntVar и т. Д. Если он окажется полезным / популярным, его можно объединить с официальным пакетом flag.

person deft_code    schedule 25.08.2013
comment
Спасибо за пакет flagutil. Я попробую. - person Blaszard; 26.08.2013