python - 如何将 argparse 参数传递给类

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

所以,我在主类之外定义了 argparse 参数,并想知道如何将它们放入类中。这甚至是正确的方法吗?我应该让 argparse 在我的类(class)下成为一个函数吗?

提前感谢您的任何帮助、引用等。

编辑:11/16 2:18 EST

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

好的,我花了一些时间,但我设法把它拼凑起来。 RyPeck 的回答帮助我获得了我的论点(我的代码丢失了一些东西),但后来当我尝试测试代码时,我遇到了未绑定(bind)的方法错误。我不知道那是什么意思。我有没有提到我辜负了我的网名?

直到我找到并阅读 this 才真正点击.这是我的工作代码。如果有人对此有任何补充,包括“你仍然做错了,这样做,正确的方式”。我全是耳朵。同时,感谢您的帮助。

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

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

最佳答案

使用 parser.parse_args 并用 vars 包裹它来转换特殊的 argparse Namespace键入常规 Python 字典。一般来说,您需要这种模式:

def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('foo')
  parser.add_argument('bar')
  args = parser.parse_args()
  args_dict = vars(args)

之后,您可以将参数显式地或一次全部传递给任何需要它的类或函数。对于一个类,最好显式地编写所需的参数。像这样:

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

  def Print(self):
    print self.foo
    print self.bar

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

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 所做的那样。

关于python - 如何将 argparse 参数传递给类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20021693/

相关文章:

java - 如何添加类的匿名实例作为 ActionListener

Java log4j 并不总是记录最后一行

javascript - 如何通过Jquery脚本将图像加载到html中?

python - append 到函数内部列表时出现问题

javascript - 摆脱多余的方法定义

java - Java编译如何在另一个类中创建一个类的对象?

python - 如何将脚本输出写入文件和命令行?

mysql - 如何创建 Cron 作业来将 MySQL 和 FTP 备份备份到我的备份服务器?

python - 区分 numpy 数组的基本和高级切片

python - 如何在 django url 中用 - 替换 %20