将位置参数传递给函数
Passing positional arguments to functions
我正在编写一个模块,可以直接从导入访问,也可以使用 argparse
从命令行访问。
如何让我的函数同时用于 argparse
和一般模块导入? Argparse 要求我使用类似的东西:
import argparse
def foo(args):
arg1 = args.arg1
arg2 = args.arg2
if __name__ == '__main__':
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser_foo = subparsers.add_parser('foo')
parser_foo.add_argument('arg1')
parser_foo.add_argument('arg2')
parser_foo.set_defaults(func=foo)
args = parser.parse_args()
args.func(args)
但是如果我导入这个模块,我不能只输入一个参数“args
”就可以了。
我想过只使用 **kwargs
来接收参数(将 argparse
参数作为 vars(**args)
传递),但我不确定这是否是好的做法。
def foo(**kwargs):
arguments = {
arg1 = None,
arg2 = None,
}
arguments.update(**kwargs)
arg1 = arguments['arg1']
arg2 = arguments['arg2']
然后,每次我使用导入模块中的函数时,我都必须使用关键字参数。
foo(arg1='value1',arg2='value2')
什么是解决这个问题的更好方法?
有没有办法使用 argparse 传递位置参数?所以当导入模块时,可以做
foo('value1','value2')
编辑
我想到了另一种可能的解决方案
def foo(arg1=None,arg2=None):
pass
这样函数将接受 kwargs 和 args。 Good/bad练习?
您可以使用 vars() 从您的命名空间中获取字典。这是一个简单的例子:
import argparse
def introduce(name, age):
print '{} is {} years old'.format(name, age)
def handle_parameters():
parser = argparse.ArgumentParser()
parser.add_argument('name', type=str)
parser.add_argument('age', type=int)
return parser.parse_args()
def main():
args = handle_parameters()
introduce(**vars(args))
introduce('john', 10)
if __name__ == '__main__':
main()
如果您有很多参数或者您不喜欢这个解决方案,您可以创建自己的命名空间并仅将一个参数(命名空间)传递给您的函数,如 this post 中所述。
希望对您有所帮助。
我正在编写一个模块,可以直接从导入访问,也可以使用 argparse
从命令行访问。
如何让我的函数同时用于 argparse
和一般模块导入? Argparse 要求我使用类似的东西:
import argparse
def foo(args):
arg1 = args.arg1
arg2 = args.arg2
if __name__ == '__main__':
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser_foo = subparsers.add_parser('foo')
parser_foo.add_argument('arg1')
parser_foo.add_argument('arg2')
parser_foo.set_defaults(func=foo)
args = parser.parse_args()
args.func(args)
但是如果我导入这个模块,我不能只输入一个参数“args
”就可以了。
我想过只使用 **kwargs
来接收参数(将 argparse
参数作为 vars(**args)
传递),但我不确定这是否是好的做法。
def foo(**kwargs):
arguments = {
arg1 = None,
arg2 = None,
}
arguments.update(**kwargs)
arg1 = arguments['arg1']
arg2 = arguments['arg2']
然后,每次我使用导入模块中的函数时,我都必须使用关键字参数。
foo(arg1='value1',arg2='value2')
什么是解决这个问题的更好方法?
有没有办法使用 argparse 传递位置参数?所以当导入模块时,可以做
foo('value1','value2')
编辑
我想到了另一种可能的解决方案
def foo(arg1=None,arg2=None):
pass
这样函数将接受 kwargs 和 args。 Good/bad练习?
您可以使用 vars() 从您的命名空间中获取字典。这是一个简单的例子:
import argparse
def introduce(name, age):
print '{} is {} years old'.format(name, age)
def handle_parameters():
parser = argparse.ArgumentParser()
parser.add_argument('name', type=str)
parser.add_argument('age', type=int)
return parser.parse_args()
def main():
args = handle_parameters()
introduce(**vars(args))
introduce('john', 10)
if __name__ == '__main__':
main()
如果您有很多参数或者您不喜欢这个解决方案,您可以创建自己的命名空间并仅将一个参数(命名空间)传递给您的函数,如 this post 中所述。
希望对您有所帮助。