Python - необязательный аргумент, ленивый с помощью eval()

Я пытаюсь разобрать с argparse. У меня есть необязательный аргумент, называемый TileScheme:

parser.add_argument("--TileScheme", "--TS", default = PuertoRico2018)

Я хочу использовать входные данные из этого аргумента в качестве объекта, поэтому я делаю это:

TileScheme = eval(args.TileScheme)

Однако, поскольку это необязательный аргумент со значением по умолчанию, я часто не хочу писать в необязательном аргументе. Я хочу передать только числовые значения. Тем не менее, я получаю это сообщение об ошибке, когда я делаю это:

TypeError: eval() arg 1 must be a string or code object

Это говорит об этом, хотя eval() изменяет необязательный аргумент! Что делать???

Ура! O.Fried

2 ответа

parser = ArgumentParser()
parser.add_argument("--TileScheme", "--TS")
args = parser.parse_args()

TileScheme = eval(args.TileScheme) if args.TileScheme is not None else PuertoRico

Или, если вам понятно:

if args.TileScheme is None:
    TileScheme = PuertoRico
else:
    TileScheme = eval(TileScheme)

In [116]: import argparse

определить экземпляр класса:

In [118]: class Foo():
     ...:     pass
     ...: 
In [119]: PR = Foo()
In [120]: PR
Out[120]: <__main__.Foo at 0x7f4cd94cd518>

Парсер:

In [121]: parser = argparse.ArgumentParser()
In [122]: parser.add_argument('-f',default=PR);

Без аргументов:

In [123]: args = parser.parse_args([])
In [124]: print(args)
Namespace(f=<__main__.Foo object at 0x7f4cd94cd518>)

Eval из строки работает, но так же, как и обычный args.f:

In [125]: eval('args.f')
Out[125]: <__main__.Foo at 0x7f4cd94cd518>
In [126]: args.f
Out[126]: <__main__.Foo at 0x7f4cd94cd518>

Теперь с определенной пользователем строкой:

In [128]: args = parser.parse_args(['-f','PR'])
In [129]: args
Out[129]: Namespace(f='PR')
In [130]: eval('args.f')     # eval of the string doesn't help
Out[130]: 'PR'
In [131]: eval(args.f)       # eval of the value does
Out[131]: <__main__.Foo at 0x7f4cd94cd518>

Вместо None Тест, который я предложил рано, вы могли бы сделать isinstance тестовое задание:

In [132]: if isinstance(args.f, Foo):
     ...:     print(args.f)
     ...: else:
     ...:     print(eval(args.f))
     ...:     
<__main__.Foo object at 0x7f4cd94cd518>
In [133]: args = parser.parse_args([])
In [134]: if isinstance(args.f, Foo):
     ...:     print(args.f)
     ...: else:
     ...:     print(eval(args.f))
     ...:     
<__main__.Foo object at 0x7f4cd94cd518>

Или альтернативно проверить, если args.f это строка

Упс: я должен был написать TileScheme = eval("args.TileScheme") с цитатами:) спасибо за помощь, хотя @hpaulj!!

Другие вопросы по тегам