2017-01-16 7 views
1

У меня есть функция в файле, который принимает различные типы параметров (междунар, строки, словари, списки ...)Casting Входные аргументы для исправления типа

Обычно я называю эту функцию из другого, передавая право параметры, но я хотел бы также назвать это с консоли (для целей тестирования)

Проблема в том, что входные аргументы хранятся в виде строк, поэтому я не могу напрямую передать их функции.

Есть ли способ автоматически передавать параметры с консоли на функцию, поддерживающую правильный формат?

import sys 

def myfunction(mystring, myint, mydict, mylist): 
    # check that types are correct 
    assert type(mystring) is str 
    assert type(myint) is int 
    assert type(mydict) is dict 
    assert type(mylist) is list 

    # print input parameters 
    print mystring 
    print myint 
    print mydict 
    print mylist 

def main(args): 
    print args 
    myfunction(*args) # pass the parameters to the function 

if __name__ == '__main__': 
    main(sys.argv[1:]) # discard 1st element which is the filename 

Для вызова моей функции из консоли я просто делаю:

python myfile.py "hello" 5 {'age':30} [1,2,3,4] 

assert Первых succeds, так как он ожидает строку, а второй один не удается, так как он ожидает Int.

print args от основной функции возвращает ['hello', '5', '{age:30}', '[1,2,3,4]'] (поэтому аргументы были правильно проанализированы, но они хранятся в виде строк).

Мне просто нужно преобразовать их в нужный формат.

Любые идеи?

+0

Возможно, вы можете использовать [argparse] (https://docs.python.org/3/ библиотека/argparse.html) библиотека – Wolkodav

ответ

1

Вы можете передать их в виде списка Python:

python myfile.py "['hello',5,{'age':30},[1,2,3,4]]" 

, а затем получить аргументы, используя ast.literal_eval

import ast,sys 
if __name__ == '__main__': 
    args = ast.literal_eval(sys.argv[1]) 
    main(args) 

Теперь args является list стоит ['hello', 5, {'age': 30}, [1, 2, 3, 4]]

Чтобы быть действительно переносимыми между shells (windows, Linux), вышеприведенный подход является предпочтительным: двойные кавычки для защиты аргумента, простые цитаты для защиты строк. Выполнение этого наоборот работает с оболочками Linux/MSYS, но не с Windows (одинарные кавычки на самом деле не кавычки в окнах)

+0

Работал. Я добавил некоторую проверку, что входной параметр представляет собой строку, содержащую список с параметрами в правильном формате перед вызовом функции. –