Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2015 15:05:02

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с argparse

Мне нужено сделать аналог команды dir.
Я не понимаю как добавть необязательный аргумент. Я знаю, что если имя аргумента начать с двух тире, то этот аргумент будет не обязательный, но в этом случае, нужно будет сначала писать имя аругмента, а потом присваивать ему значение. В то время как оригинальной программе можно передавать путь (и не указывать, какому атрибуту мы присваиваем это значение) и так же можно его опустить и тогда просто выведутся файлы в текущем каталоге.

Сейчас есть вот такой код:

parser = argparse.ArgumentParser()
parser.add_argument('--p', '--path', default=os.getcwd(),
                    help='путь к папке содержимое, которой надо отобразить')
parser.add_argument('-a', choices=['d'], help='Отображение файлов с заданными '
                                              'атрибуми\nd - отображение '
                                              'только папок')
args = parser.parse_args()
print(args)

Из консоли его можно вызывать только так:
my_dir.py –path=C:\
а мне надо, чтобы можно было не писать –path, возможно это сделать?

Офлайн

#2 Дек. 5, 2015 19:23:52

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Работа с argparse

maxim83632
Я знаю, что если имя аргумента начать с двух тире, то этот аргумент будет не обязательный
нет
эт просто стиль
если одно то должна быть одна буква, а если слово - то два тире

import os
#1
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("path", nargs='?', default=os.getcwd())
args = parser.parse_args()
print args.path
#2
import sys
print sys.argv[1] if len(sys.argv) > 1 else os.getcwd()



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Дек. 5, 2015 19:53:13

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с argparse

terabayt
эт просто стиль
https://docs.python.org/3/library/argparse.html#name-or-flags и это https://docs.python.org/3/howto/argparse.html#introducing-optional-arguments тогда как понимать?

Отредактировано maxim83632 (Дек. 5, 2015 20:13:44)

Офлайн

#4 Дек. 5, 2015 22:52:13

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с argparse

terabayt
Сейчас ещё пытался организовать парсинг аргументов для команды attrib (http://ab57.ru/cmdlist/attrib.html) и там вот прям конкретно встрял. Подскажите как реализовать указание добавления и снятия атрибута.

Офлайн

#5 Дек. 5, 2015 23:49:35

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Работа с argparse

не
с виндовсом я вам никак не помогу
гугл в помощь



————————————————
-*- Simple is better than complex -*-

Офлайн

#6 Дек. 6, 2015 00:17:49

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с argparse

terabayt
Да там не в винде вообще суть. У меня ни как не получается реализовать 2 необязательных позиционных аргумента.
Нужно, чтобы парсер аргументов распознавал записи вида:
my_attrib.py +r ./my_file - добавляет атрибут файлу
my_attrib.py -r ./my_file - снимает атрибут у файла
Ума не приложу именно как добавить действия (- и +). Если использовать обычные имена то все просто, а вот в таком случае не представляю, что делать.

Отредактировано maxim83632 (Дек. 6, 2015 00:20:07)

Офлайн

#7 Дек. 6, 2015 01:04:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа с argparse

Просто делаешь несколько исключающих групп и добавляешь в парсер.
python.org. mutually exclusive group



Офлайн

#8 Дек. 6, 2015 01:41:47

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с argparse

py.user.next
Просто делаешь несколько исключающих групп и добавляешь в парсер.
У меня проблема не в том, чтобы результате у каждого ключа было только 1 значение, а в том, что я не могу просто на пример установить в качестве ключа
-

Офлайн

#9 Дек. 6, 2015 04:18:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа с argparse

import argparse
 
parser = argparse.ArgumentParser(prefix_chars='-+/', add_help=False)
 
group_r = parser.add_mutually_exclusive_group()
group_r.add_argument('-r', dest='roff', action='store_true', help='r off')
group_r.add_argument('+r', dest='ron', action='store_true', help='r on')
 
group_h = parser.add_mutually_exclusive_group()
group_h.add_argument('-h', dest='hoff', action='store_true', help='h off')
group_h.add_argument('+h', dest='hon', action='store_true', help='h on')
 
parser.print_help()
parser.parse_args('-r +h'.split())



Отредактировано py.user.next (Дек. 6, 2015 04:25:21)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version