2016-03-01 2 views
0

Я пытаюсь назначить свои аргументы из argparse в переменные. У меня есть два сценария: один - это синтаксический анализатор, а другой - модуль. Когда я пытаюсь назначить переменную, я получаю, что объект кортежа не имеет ошибки атрибута. Любые рекомендации будут оценены.Python: назначение переменных из функции (* args) с помощью argparse

def main(): 
parser = argparse.ArgumentParser(description='A simple front end script interface') 
subparsers = parser.add_subparsers(help='(run various listed scripts..)', dest='mode') 

add_pyrr_command_options(subparsers) 
args = parser.parse_args() 

if args.mode == "pyrr": 
    pyrr.parse_cmds(args) 
else: 
    parser.print_usage() 

pyrr.py

def parse_cmds(*args): 
print(args) 
pass 
(Namespace(mode='pyrr', plugin_name='ntuser', reg_loc='/user/home', rip_loc='/user/some'),) 

При попытке присвоить переменную через исследуемые методами (например, arg.plugin_name) Я получаю AttributeError: 'tuple' object has no attribute 'pyrr'

ответ

1

Так args является Namespace объект

Namespace(mode='pyrr', plugin_name='ntuser', reg_loc='/user/home', rip_loc='/user/some') 

И как ваш первый скрипт показывает вам c использование args.mode.

В (с исправлен отступом)

def parse_cmds(*args): 
    print(args) 
    pass 

args является кортеж (из-за *args), например, (Namespace(...),). С простой args вы могли продолжать получать доступ mode с:

def parse_cmds(args): 
    args.mode 

Другой вариант передать словарь с помощью **kwargs

def parse_cmds(**vargs): 
    # vargs is a keyword dictionary 

parse_cmds(vars(args)) # converting namespace to dictionary 

Я думаю, что вы на правильном пути. Вам просто нужно различать namespace объект, словари и кортежи.

В ваших примерах «pyrr» - это строковое значение args.mode, а также имя импортированного модуля pyrr.py.

+0

Как правило, плохо использовать имена строк, соответствующие имени модуля? – ImNotLeet

+1

Только если это смущает вас! – hpaulj

Смежные вопросы