Как передать * args и ** kwargs в скрипт на python одновременно из командной строки - PullRequest
0 голосов
/ 07 июня 2019

Я не могу понять, как передать как * args, так и ** kwargs в скрипт на python из cli. * Args, кажется, включает в себя ** записи kwargs так, как я делаю это.Должен ли я выяснить, сколько существует ** kwargs, затем вычесть это число из * args, чтобы определить, какие аргументы были аргументами?

Я могу сделать это, передав функцию в сценарии, но еслиЯ хочу передать аргументы из cli, как определить, какие из них для * args, а какие для ** kwargs?

Это работает:

def Func(*args,**kwargs):

    for arg in args:
        print arg
    for item in kwargs.items():
        print item

print Func(1,2,3,x=7,u=8)

Но я хочу кое-чтокак это:

def Func(*args,**kwargs):

    for arg in args:
        print arg
    for item in kwargs.items():
        print item

print Func(sys.argv[1], sys.argv[2], sys.argv[3:])

Вот что я получаю:

$ ./test.py 1 2 3 4 x=7 u=8

1
2
['3', '4', 'x=7', 'u=8']
None

Но я хочу приблизиться к этому:

$ ./test.py 1 2 3 4 x=7 u=8
1
2
['3', '4']
{'x': '7', 'u': '8'}

или к этому:

$ ./test.py 1 2 3 4 x=7 u=8

1
2
3
4
('x', 7)
('u', 8)

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 07 июня 2019

Как сказано в комментарии @kingforever выше, использование модуля argparse было бы намного чище и безопаснее (проверка обязательных аргументов, правильности аргументов и т. Д.).

В любом случае, одно из возможных легких и быстрых решений, которое вы просите, будет:

args = [x for x in sys.argv if '=' not in x]                                     
kwargs = {x.split('=')[0]: x.split('=')[1] for x in sys.argv if '=' in x}        
print Func(*args, **kwargs)                                                      
...