Как использовать argsparse для доступа к части файла конфигурации в python? - PullRequest
1 голос
/ 25 марта 2020

У меня есть этот файл config.py:

# config.py 

maria = dict(
    corners = [1,2,3,4],
    area = 2100
)

john = dict(
        corners = [5,6,7,8],
        area = 2400 
    )

и я хочу использовать параметры из него, запустив основную программу, используя argsparse. примерно так:

# main.py

import config
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("user", help="maria or john")
args = parser.parse_args()
print(args.user)
print(config.args.user['corners'])

при запуске:

pyhton3 main.py maria

Я получаю синтаксическую ошибку на 2-м отпечатке, где я хочу получить [1,2,3,4]. Как я могу использовать аргумент из argparse в качестве атрибута для доступа к соответствующим данным в файле конфигурации?

Ответы [ 3 ]

2 голосов
/ 25 марта 2020

IIU C: Вы можете использовать встроенную функцию getattr в python.

getattr(object, name[, default]):

Возврат значение именованного атрибута объекта. имя должно быть строкой. Если строка является именем одного из атрибутов объекта, результатом является значение этого атрибута. Например, getattr (x, 'foobar') эквивалентен x.foobar. Если указанный атрибут не> существует, возвращается значение по умолчанию, если оно предоставлено, в противном случае возникает AttributeError.

Заменить:

print (config.args.user['corners'])

С:

print(getattr(config, args.user)["corners"])
1 голос
/ 25 марта 2020

Избегайте использования исполняемого кода Python для конфигурации. Используйте что-то вроде JSON:

config.json будет выглядеть как

{
    "maria": {
        "corners": [1,2,3,4],
        "area": 2100
    },
    "john": {
        "corners": [5,6,7,8],
        "area": 2400
    }
}

И ваш скрипт будет использовать

# main.py

import json
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("user", help="maria or john")
args = parser.parse_args()
with open("config.json") as f:
    config = json.load(f)

print(args.user)
print(config[args.user]['corners'])
0 голосов
/ 25 марта 2020

Один из способов go заключается в том, чтобы заключить ваши параметры в один общий текст:

# config.py

params = {'maria': {'corners': [1,2,3,4], 'area': 2100},
          'john':  {'corners': [5,6,7,8], 'area': 2400}}

И тогда вы можете просто сделать это в main.py:

print(config.params[args.user]['corners'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...