LINUX.ORG.RU

Ответ на: комментарий от matrixd

Что-то как с листами не получается с ним работать.

Deleted
()
Ответ на: комментарий от Deleted

Блин, точно ведь. Опять туплю.

Deleted
()
Ответ на: комментарий от Deleted

А чем способ берсерка не изящен?

if len(sys.argv) > 1:
Если вам нужен sys.argv[1].
Как бы вы хотели это решать? :)

znenyegvkby
()
Ответ на: комментарий от Deleted

Может, есть способ поизящнее, чем проверять длину?

Судя по тому, что именно ты там проверяешь, тебе лучше argparse заюзать, а не городить велосипед. Вот это и будет самый изящный способ.

Psych218 ★★★★★
()

А так вообще у тебя первая проверка if sys.argv[1] лишняя по сути. Нет, юзер, конечно, может передать "", но проверяешь ты вряд ли это, а узнать, есть ли там вообще аргумент или нет — if len(sys.argv) > 1:. Вместо этого, а не вместе.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)

Больше говнокода в тред!

if "add" in sys.argv[:2]:
thesis ★★★★★
()
Ответ на: комментарий от Deleted

Неохота библиотечные парсеры использовать. Напрасно в python нет case.

Deleted
()
Ответ на: комментарий от beresk_let

предлагаю не останавливаться на этом и реализовать на исключениях всю логику

Ну итераторы же на них и реализовали.

theNamelessOne ★★★★★
()

Раз уж тут советуют библиотеки, то рекомендую попробовать ещё и cleo. Только это не парсер аргументов, а целый фреймворк для создания консольных приложений. Inspired by Symfony/Console.

Kilte ★★★★★
()
Ответ на: комментарий от Deleted

Может, есть способ поизящнее, чем проверять длину?

да, argparse

Dred ★★★★★
()

Я делаю так во всяких мелких скриптах, если может быть только один аргумент.

if sys.argv[-1] == 'add':
    ...
[-1] вернет последний элемент sys.argv, который может быть либо доп.аргументом, либо именем скрипта.

Smola
()
Последнее исправление: Smola (всего исправлений: 2)

не занимайся онанизмом и других на это не подстрекай. optparse

bryak ★★★★
()
Ответ на: комментарий от pawnhearts

Ну тогда argparse или docopt, иначе ручной парсинг быстро превратится в боль при добавлении еще пары опций.

Smola
()
Ответ на: комментарий от Smola

А разве добавление пары опций в ручной парсинг будет сложнее, чем добавление пары опций через библиотечный парсер?

Deleted
()

Почему так нельзя сделать?

потому что питон. Хочешь красоты - мирись с сложностью:

...
   if $ARGV[0] eq 'add';
Deleted
()
Ответ на: комментарий от Deleted

Зависит от количества опций и наличия [необязательных] аргументов, флагов (в короткой и длинной форме). Уверен, ты не захочешь парсить вручную все варианты:

script.py some_file.txt
script.py -a SOME_NAME --some_long_arg some_file.txt
script.py -a SOME_NAME -d -g optional_arg some_file.txt
script.py -gd some_file.txt
... etc

Smola
()
Ответ на: комментарий от beresk_let

Без фабрик это решение будет неполным.

Deleted
()
Ответ на: комментарий от x0r

экспешоном дорого такие вещи проверять, да и профит с этого не совсем понятно какой.

from __future__ import print_function

import timeit
import sys


def foo_exc(*args):
    try:
        if args[0] == "add":
            print("lol", file=sys.stderr)
        else:
            print("unknown command", file=sys.stderr)
    except IndexError:
        print("no args given", file=sys.stderr)

def foo_noexc(*args):
    if args:
        if args[0] == "add":
            print("lol", file=sys.stderr)
        else:
            print("unknown command", file=sys.stderr)
    else:
        print("no args given", file=sys.stderr)

if "__main__" == __name__:
    print(timeit.timeit("foo_exc('add')", setup="from __main__ import foo_exc"))
    print(timeit.timeit("foo_exc()", setup="from __main__ import foo_exc"))
    print(timeit.timeit("foo_noexc('add')", setup="from __main__ import foo_noexc"))
    print(timeit.timeit("foo_noexc()", setup="from __main__ import foo_noexc"))
(17:16) novel@yrly:~ %> python args.py  2>/dev/null
2.69668388367
5.61795711517
2.69180679321
2.34060001373
(17:17) novel@yrly:~ %> 
Novel ★★★★
()

Ошибка, если sys.argv[1] нет:

кстати, раз уж предлагают стремные решения, и я предложу (это не значит что им стоит пользоваться)

if (sys.argv + [None] * index)[index] == 'add'
index соответственно любой, но в данном случае равен 1

Dred ★★★★★
()

Argparse не предлагать, он мне не нравится.

Тогда тебе лучше не писать на питоне.

Как тогда нужно это делать?

см. выше.

ktan ★★★
()
Ответ на: комментарий от Deleted

А я что, запрещаю? Это так, рекомендация. Только вот код, основанный на «мне так не нравится», а не на каких-то веских причинах, в серьезные проекты принимать не будут :)

ktan ★★★
()
Ответ на: комментарий от ktan

Причём веские причины «это им в серьезном проекте так нравится».

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.