2016-10-10 81 views
4

我有一個關於傳遞參數傳遞給裏面的變量初始化蟒蛇argparse由init

問題這裏是我的代碼工作版本。

class A: 
    def __init__(self): 
     self.id = args.id 
     self.pw = args.pw 
     self.endpoint = args.endpoint 

    def B: 
     ..do something.. 

if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-i', '--id', type=str, help = 'username') 
    parser.add_argument('-p', '--pw', type=str, help ='password') 
    parser.add_argument('-e', '--end_point', type=str , help='end point of api') 
    args = parser.parse_args() 

上面的代碼工作,但我想做,現在是把A類裏面的函數內的所有argparse代碼和分配對Arg的初始化。 我查看了網頁,找不到一個好的解決方案。

class A: 
    def __init__(self): 
     self.id = self.parse_args(id) 
     self.pw = self.parse_args(pw) 
     self.endpoint = self.parse_args(endpoint) 

    def B: 
     ..do something.. 

    def parse_args(self,args): 
     parser = argparse.ArgumentParser() 
     parser.add_argument('-i', '--id', type=str, help = 'username') 
     parser.add_argument('-p', '--pw', type=str, help ='password') 
     parser.add_argument('-e', '--end_point', type=str , help='end point of api') 
     return parser.parse_args(args) 

好吧,確切地說,我不知道我該如何解決這個問題。

在上面的例子中,我只是調用args.variable讓args工作,但在這種情況下,我調用self.id = self.parse_args.id?

parse_args函數返回指定參數和我也試過self.id = self.parse_args(ID),這是給我

TypeError: 'builtin_function_or_method' object is not iterable 

原因的一部分爲什麼我要成參數分隔成一個單獨的功能是用argparse簡化我的單元測試。

任何幫助將不勝感激。

+0

不是說不行,你需要顯示錯誤或結果,你有。 –

+0

您能否請擴展*不起作用?什麼不能正確工作?它應該如何工作?您輸入什麼來得出結論:它不起作用?它應該如何工作? – idjaw

+0

另一方面,你的函數缺少自引用'parse_args(self,args)' –

回答

8

所以在第一種情況下,你必須做

if __name__ ... 
.... 
args = parser.parse_args() 
a = A() 

A.__init__可以看到args,因爲它是全球性的。

我不明白你爲什麼想讓代碼的一部分A;你不希望它每次都使用A()運行嗎?你只能製作一組值。

我認爲這將是測試,使parse_args代碼的方法,可以在創建類後,隨意運行。

下面是有,我覺得,還不錯靈活性的方法:

import argparse 

class A: 
    def __init__(self, id=None, pw=None, endpoint=None): 
     self.id = id 
     self.pw = pw 
     self.endpoint = endpoint 

    def parse_args(self, argv=None): 
     parser = argparse.ArgumentParser() 
     parser.add_argument('-i', '--id', type=str, help = 'username') 
     parser.add_argument('-p', '--pw', type=str, help ='password') 
     parser.add_argument('-e', '--end_point', type=str , help='end point of api') 
     args = parser.parse_args(argv) 
     self.id = args.id 
     self.pw = args.pw 
     self.endpoint = args.end_point 

    def __str__(self): 
     return 'A(%s,...)'%self.id 

if __name__ == "__main__": 
    a = A() 
    print(a) 
    a.parse_args() 
    print(a) 
    b = A(id='you') 
    print(b) 
    b.parse_args(['--id','me']) 
    print(b) 

值可以對象創建過程中設置,由命令行或定製的argv

1610:~/mypy$ python stack39967787.py --id joe 
A(None,...) 
A(joe,...) 
A(you,...) 
A(me,...) 

===== =============

我的第一方法(臨時刪除)

class A(): 
    def __init__(self): 
     args = self.parse_args() 
     self.a = args.a 
     etc 
    @static_method 
    def parse_args(self): 
     parser = .... 
     return parser.parse_args() 

=====================

class A可以作爲Namespace,直接讓parse_args更新artributes(它使用setattr

import argparse 
class A: 
    def __init__(self, id=None, pw=None, endpoint=None): 
     self.id = id 
     self.pw = pw 
     self.endpoint = endpoint 

if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-i', '--id', type=str, help = 'username') 
    parser.add_argument('-p', '--pw', type=str, help ='password') 
    parser.add_argument('-e', '--endpoint', type=str , help='end point of api') 
    args = parser.parse_args() 
    print(args) 

    a = A() 
    parser.parse_args(namespace=a) 
    print(vars(a)) 

生產:

1719:~/mypy$ python stack39967787_1.py --id joe --pw=xxxx -e1 
Namespace(endpoint='1', id='joe', pw='xxxx') 
{'endpoint': '1', 'id': 'joe', 'pw': 'xxxx'} 
+0

第一種方法可以正常工作,非常感謝,第二種方法,我仍然可以使用self。變量在其他函數中,即使它沒有在__init__中聲明? – Jessi

+0

哦,你更新了你的答案,就像我在評論你的老版本一樣,非常感謝! – Jessi

+0

對不起;我添加了'staticmethod'外形;我也意識到你的' class'可以直接用作'Namespace'。 – hpaulj