我对一般编码特别是 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)
c1
和 c2
都会被创建。不过,最好的方法是显式创建类,就像使用 c1
所做的那样。
关于python - 如何将 argparse 参数传递给类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20021693/