【问题标题】:When using argparse in Python 2.7, how can I pass more than 'args' into my default function?在 Python 2.7 中使用 argparse 时,如何将多个 'args' 传递给我的默认函数?
【发布时间】:2018-07-04 02:55:48
【问题描述】:

我正在尝试将一些参数传递给解析器的默认函数,这些参数并非直接来自命令行中的参数。用户在 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 将在此处成功打印出 args。注意如何

(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 本身的方法。

【问题讨论】:

  • 你能说得更清楚一点吗?还有更多代码?
  • 我不确定你想做什么......但无论如何这似乎都不是正确的做法......
  • @TylerCowan 你不明白哪一部分?我是刚来这里提问的新手,而且我没有和其他人一起做很多编程,所以我不确定还能提供什么。

标签: python python-2.7 argparse


【解决方案1】:

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

   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)

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

【讨论】:

  • 在开发过程中print args 是个好主意,这样您就可以清楚地了解它是什么。它将包含由参数以及set_defaults 创建的属性。解析后您选择对这些属性执行的任何操作都在argparse(常规 Python 代码)之外。
  • 要记住的关键是函数是一个对象,可以分配给任何变量,甚至可以存储在列表中。 foo=test_function; foo(arg1, arg2, ...)set_defaults 所做的只是将指向该函数对象的指针存储在 args 命名空间中。你自己的代码可以对那个对象做任何事情。
【解决方案2】:

这里是你只将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.")

【讨论】:

  • 虽然我自己的方式对我来说效果更好,但这个答案最准确地回答了我认为的问题,所以我选择它作为选择的答案。谢谢@user2357112
猜你喜欢
  • 2020-08-09
  • 2015-01-28
  • 2020-05-11
  • 2018-03-07
  • 2018-08-23
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多