2017-01-16 116 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

工作。我在調用函數之前添加了一些驗證,即輸入參數是一個包含正確格式參數的列表的字符串。 –