将输入参数强制转换为正确的类型

时间:2017-01-16 16:56:18

标签: python arguments sys

我在一个接收不同类型参数的文件中有一个函数(int,strings,dictionaries,lists ...)

通常我从另一个函数调用此函数,传递正确的参数,但我也希望能够从控制台调用它(用于测试目的)

问题是输入参数存储为字符串,所以我不能直接将它们传递给函数。

有没有办法自动将参数从控制台传递给保持正确格式的函数?

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成功,因为它需要一个字符串,但第二个失败,因为它需要一个int。

main函数中的print args返回['hello', '5', '{age:30}', '[1,2,3,4]'](因此参数已被正确解析,但它们存储为字符串)。

我只需要将它们转换为正确的格式。

有什么想法吗?

1 个答案:

答案 0 :(得分: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]]

要在shell(windows,Linux)之间真正移植,首选上述方法:双引号保护参数,简单引号保护字符串。反过来使用Linux / MSYS shell而不是Windows(单引号在Windows中不是真正的引用)