Вызов скрипта с кортежами в качестве аргументов - PullRequest
0 голосов
/ 12 января 2019

Я хочу иметь возможность вызывать скрипт Python из командной строки следующим образом:

python ./pyProg (1, 2) (2, 3)

и затем сможете манипулировать ими (введите столько, сколько хотите, например, можете ввести в 10 кортежей) в моей программе?

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

python ./pyProg 1,4 2,2

или:

python ./pyProg "(1, 2)" "(2,2)"

и они проходят как струны .. Каков наилучший способ достичь того, что я хочу сделать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Если вы ожидаете, что ваши аргументы представлены в определенном формате, удобство использования будет, вероятно, лучше, если вы используете обычный анализатор обработки аргументов, который анализирует отдельные значения.

arg_tuples = [tuple(t.split(',') for t in sys.argv[1:]]

Пропуск скобок позволяет вам опускать кавычки в командной строке оболочки (хотя кавычки, конечно, могут быть необходимы по другим причинам, если ваши члены кортежа не всегда просто числа).

sys.argv[] - список строк по определению, оболочка (переносимо) не имеет другого типа данных.

0 голосов
/ 12 января 2019

Вы можете передать кортежи как строки и преобразовать их в фактические кортежи, используя ast.literal_eval():

from sys import argv
from ast import literal_eval

for x in argv[1:]:
    tup = literal_eval(x)
    print(tup, type(tup))  

Что можно назвать так:

$ python ./pyProg.py "(1, 2)"
(1, 2) <class 'tuple'>

Ошибки обработки:

Если переданная строка не является допустимым выражением, могут быть вызваны как SyntaxError , так и ValueError . Поэтому, вероятно, безопасно обернуть вышеупомянутое в try/except:

from sys import argv
from ast import literal_eval

for x in argv[1:]:
    try:
        tup = literal_eval(x)
        print(tup, type(tup))
    except (SyntaxError, ValueError):
        print("%s -> Invalid tuple format given" % x)

Что можно увидеть здесь:

$ python ./pyProg.py "(1, 2"
(1, 2 -> Invalid tuple format given
$ python ./pyProg.py "(1, 2) (1, 2)"
(1, 2) (1, 2) -> Invalid tuple format given
...