关于python:如何将argparse参数传递给类

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()

在没有参数的情况下运行此代码会四次打印"假"。在类实例外两次,在类实例内两次。


使用parser.parse_args并用vars将其包装,以将特殊的argparse命名空间类型转换为常规的python dict。通常,您需要此模式:

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)

将创建c1c2。不过,最好的方法是显式地创建类,就像使用c1一样。


简单的for循环可以传递参数(或设置属性):

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])

但是…也许优雅的方法是用argparse初始化类,然后按名称空间直接将它们设置为类:

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文档。