在 Python 2.7 中使用 argparse 时,如何将超过 'args' 的内容传递到我的默认函数中?



我正在尝试将一些参数传递给我的解析器的默认函数,该函数不是直接来自命令行中的参数。用户在 cli 上提供的参数旨在用于查找所需的实际值,因为它的实际值对重复键入的用户不友好。

使用 argparse,您可以执行以下操作:

parser = argparse.ArgumentParser()
def test_function(args):
print args
Parser.set_defaults(func=test_function)
args = parser.parse_args()
args.func(args)

test_function将在此处成功打印出参数。注意如何

(func=test_function)

不传入任何参数,它似乎只是传入 args,在这里添加括号可以防止传入 args,因为如果你这样做它不会被自动推送,并且输入它不起作用,因为 args 尚未定义就 Python 而言。

我也试过做

Parser.set_defaults(func=test_function, realValue=lookup_function)

然而,realValue 似乎在引用函数本身时进行评估,而不是函数返回的内容(我认为该函数甚至没有执行,所以我不确定这是否会将 args 传递到lookup_function中)。

我可能可以从test_function调用查找函数,但是我想避免这种情况,因为在我的程序中这两个函数位于单独的模块中,而且似乎有点......将它们相互导入而不是简单地将它们导入我的 main.py 文件中很混乱。

有没有人知道有什么方法可以做我想做的事情?我需要吸收它并导入跨子模块吗?

编辑为了尝试更清楚一点,我想通过 argparse 的功能将 args另一个动态值传递到test_function中;

Parser.set_defaults(func=test_function)

动态值是使用 args 的值之一找到的。我希望知道一种方法可以将另一个函数返回的新值传递给test_function或 args 本身。

我最终找到了自己的方式,我看起来很简单。 出于某种原因,我没有在脑海中将这两者结合在一起。

Parser.set_defaults(func=test_function)
args.func(args)

我认为这是 argparse 模块中的内置功能,但它比看起来简单得多。我找到了一种通过遵循正确的语法来实现向 args 添加新值的方法(谁会想到)

所以这个:

parser = argparse.ArgumentParser()
def test_function(args):
print args
Parser.set_defaults(func=test_function, realValue=lookup_function)
args = parser.parse_args()
args.func(args)

变成这样:

parser = argparse.ArgumentParser()
def test_function(args):
print args
Parser.set_defaults(realValue=lookup_function)
Parser.set_defaults(func=test_function)
args = parser.parse_args()
args.realValue(args)
args.func(args)

对不起,我想这个愚蠢的问题,希望这对将来犯类似错误的人有所帮助

这是您仅将args传递给args.func的部分:

args.func(args)
#         ^^^^ this bit!

如果你想把其他东西传给args.func,就通过它们吧!

args.func(whatever, the, heck, you, want)

如果您希望args.func接收3"fish""sweaters"作为参数,您可以这样做:

args.func(3, "fish", "sweaters")

当然,args.func会立即被这些参数阻塞,因为您编写它时只期望命名空间对象作为参数。您可以定义它以采用不同的参数:

def test_function(number, animal, garments):
print("I stuffed", number, garments, "into a big rubber", animal, "as an art project.")

最新更新