how to pass argparse arguments to a class
一般来说,我对编码非常陌生,尤其是对Python非常陌生。我正在尝试学习如何将我创建的argparse参数传递到类中,以便使用正确/推荐的方法。除了学习python之外,我还尝试学习如何以面向对象编程的方式进行操作,这样学习其他面向对象编程类型的语言就更容易了。
下面是我想做的一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import argparse class passyourcliargstome(): def __init__(self, whatdoiputheretogetmycliargs): #how do I get my cli args here? pass def otherfunctionsthatdothings(): pass if __name__ == '__main__': #grab the arguments when the script is ran parser = argparse.ArgumentParser( description='Make things happen.') parser.add_argument('-f', '--foo', action='store_true', default=False, help='here be dragons') parser.add_argument('-b', '--bar', action='store_true', default=False, help='here be more dragons') passyourcliargstome.otherfunctionsthatdothings() |
所以,我在主类之外定义argparse参数,并想知道如何将它们放入类中。这样做对吗?我应该让argparse成为类下的函数吗?
提前感谢您提供任何帮助、参考等。
编辑:11/16东部时间2:18
注意:由于我没有足够的代表来回答我自己的问题,这是我发布正确答案的唯一途径。
好吧,我花了点时间,但我还是把这个拼凑起来了。Rypick的答案帮助我获得了我的参数(我的代码丢失了一些东西),但后来我在尝试测试代码时遇到了未绑定的方法错误。我不知道那是什么意思。我有没有提到我达到了我的昵称?
直到我找到并读到这本书,它才真正发出声音。这是我的工作代码。如果有人有什么要补充的,包括"你仍然做错事,这样做,正确的方式。"我全神贯注。同时,谢谢你的帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import argparse class Passyourcliargstome(object): def __init__(self): #here's how I got my args here self.foo = args.foo self.bar = args.bar def otherfunctionsthatdothings(self): print"args inside of the main class:" print self.foo print self.bar if __name__ == '__main__': #grab the arguments when the script is ran parser = argparse.ArgumentParser(description='Make things happen.') parser.add_argument('-f', '--foo', action='store_true', default=False, help='here be dragons') parser.add_argument('-b', '--bar', action='store_true', default=False, help='here be more dragons') args = parser.parse_args() print"args outside of main:" print args.foo print args.bar #this was the part that I wasn't doing, creating an instance of my class. shell = Passyourcliargstome() shell.otherfunctionsthatdothings() |
在没有参数的情况下运行此代码会四次打印"假"。在类实例外两次,在类实例内两次。
使用
1 2 3 4 5 6 | def main(): parser = argparse.ArgumentParser() parser.add_argument('foo') parser.add_argument('bar') args = parser.parse_args() args_dict = vars(args) |
之后,您可以显式地或一次将所有参数传递给任何类或函数。对于类,最好显式地编写所需的参数。像这样:
1 2 3 4 5 6 7 8 | class MyClass(object): def __init__(self, foo, bar): self.foo = foo self.bar = bar def Print(self): print self.foo print self.bar |
现在你可以把这两个放在一起,就像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import argparse class MyClass(object): def __init__(self, foo, bar): self.foo = foo self.bar = bar def Print(self): print self.foo print self.bar def main(): parser = argparse.ArgumentParser() parser.add_argument('foo') parser.add_argument('bar') args = parser.parse_args() c1 = MyClass(args.foo, args.bar) args_dict = vars(args) c2 = MyClass(**args_dict) |
将创建
简单的
1 2 3 4 | args_dict = vars(self.parser.parse_args()) # using argparse arguments as attributes of this (self) class for item in args_dict: setattr(self, item, args_dict[item]) |
但是…也许优雅的方法是用
1 2 3 4 5 6 | class Foo: def __init__(self) self.parser = ArgumentParser() self.parser.add_argument('-f', '--foo, default=False, action='store_true', help='foo or not?') self.parser.add_argument('-b', '--bar', default=0, action='store', help='set the bar') self.parser.parse_args(namespace=self) |
空输入等同于:
1 2 3 4 | class Foo: def __init__(self) self.foo = False self.bar = 0 |
添加参数后,必须执行以下操作。
1 | args = parser.parse_args() |
如果在参数上进行打印,您将看到名称空间参数中包含所有参数。
然后你可以这样访问它们-
1 2 | print args.foo print args.bar |
从那里,你可以把它们当作普通变量来处理。有关更多详细信息和更多信息,请参阅argparse文档。