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!!