2016-10-10 76 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