如何将argparse参数传递给一个类

som*_*oob 17 python oop command-line arguments argparse

我对编码很陌生,特别是Python.我正在尝试学习如何将我创建的argparse参数传递给类以使用正确/推荐的方式.除了学习python之外,我还试图学习如何以OOP方式做事,以便学习其他OOP类型的语言变得更容易.

所以这是我想要做的一个示例:

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()
Run Code Online (Sandbox Code Playgroud)

所以,我定义的主类之外argparse参数,并想知道如何让他们内部的类.这甚至是正确的方法吗?我应该在我的班级下制作一个argparse函数吗?

提前感谢您提供任何帮助,参考等.

编辑:美国东部时间11月16日2:18

注意:由于我没有足够的代表回答我自己的问题,这是我发布正确答案的唯一办法.

好吧,我花了一些时间,但我设法把它拼凑起来.RyPeck的答案帮助我获得了我的参数(我的代码遗漏了一些东西),但后来当我试图测试代码时,我得到了未绑定的方法错误.我不知道那是什么意思.我是否提到过我的屏幕名称?

它并没有真正点击,直到我发现读这个.这是我的工作代码.如果有人有任何要补充的内容,那么直到并且包括"你仍然做错了,这样做是正确的." 我听见了.在此期间,感谢您的帮助.

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()
Run Code Online (Sandbox Code Playgroud)

不带参数运行此代码会打印False四次.在类实例之外两次,在类实例中两次.

Dav*_*ave 19

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

def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('foo')
  parser.add_argument('bar')
  args = parser.parse_args()
  args_dict = vars(args)
Run Code Online (Sandbox Code Playgroud)

之后,您可以显式地或一次性地将参数传递给任何类或函数将采用它.对于类,最好明确地编写所需的参数.像这样:

class MyClass(object):
  def __init__(self, foo, bar):
    self.foo = foo
    self.bar = bar

  def Print(self):
    print self.foo
    print self.bar
Run Code Online (Sandbox Code Playgroud)

现在你可以把这两个放在一起像这样:

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)
Run Code Online (Sandbox Code Playgroud)

双方c1c2会被创建.但是,最好的方法是明确地创建类,就像使用它一样c1.

  • @ijoseph我想这只是偏爱。我说“最好”是出于可维护性的原因,因为通常来说,其他人正在阅读您的课程(可能会扩展它),可以更轻松地了解它的作用,以及在明确将其写出来的情况下如何不破坏它们的能力。使用** kwargs,* args,setattr()等进行元处理。这不是硬性规定。用你最好的判断。 (2认同)

Ass*_*-ge 5

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

    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])
Run Code Online (Sandbox Code Playgroud)

但是...也许一种优雅的方法是使用初始化您的类,argparse然后通过名称空间将它们直接设置为该类:

  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)
Run Code Online (Sandbox Code Playgroud)

空输入等效于:

  class Foo:
  def __init__(self)
      self.foo = False
      self.bar = 0
Run Code Online (Sandbox Code Playgroud)


RyP*_*eck 2

添加参数后,您必须执行以下操作。

args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

如果对 args 进行打印,您将看到命名空间参数中包含所有参数。

然后你可以像这样访问它们 -

print args.foo
print args.bar
Run Code Online (Sandbox Code Playgroud)

从那里,您可以将它们视为普通变量。请参阅argparse 文档以获取更详细的信息。