我对编码很陌生,尤其是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函数吗?
提前感谢您提供任何帮助,参考资料等。
编辑:11/16 2:18 EST
注意:由于我没有足够的代表回答我自己的问题,这是我发布正确答案的唯一办法。
好吧,我花了一些时间,但我设法把它拼凑起来。 RyPeck的答案帮助我获得了我的参数(我的代码遗漏了一些东西),但后来当我试图测试代码时,我得到了未绑定的方法错误。我不知道那是什么意思。我是否提到过我的屏幕名称?
在我找到并阅读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四次。在类实例之外两次,在类实例中两次。
答案 0 :(得分:14)
使用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
一样。
答案 1 :(得分:3)
一个简单的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])
但是...也许优雅的方法是使用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)
空输入相当于:
class Foo:
def __init__(self)
self.foo = False
self.bar = 0
答案 2 :(得分:2)
添加参数后,您必须执行以下操作。
args = parser.parse_args()
如果你在args上打印,你会看到你在命名空间参数中有所有参数。
然后您可以像这样访问它们 -
print args.foo
print args.bar
从那里,你可以像对待普通变量一样对待它们。有关更多详细信息和更多信息,请参阅argparse documentation。