2017-01-16 107 views
1

我在接收不同类型的参数文件的功能(INT,字符串,字典,列表...)铸造输入参数正确类型

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

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

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

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/ library/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]]

要成为之间真正的便携式shell(windows,Linux),上面的方法是首选的:双引号保护参数,简单的引号来保护字符串。另一种方式可以与Linux/MSYS shell一起使用,但不能与Windows一起使用(单引号在Windows中不是真正的引号)

+0

工作。我在调用函数之前添加了一些验证,即输入参数是一个包含正确格式参数的列表的字符串。 –