夹在 argparse 和导入函数之间

Caught somewhere between argparse and import function

这是我的问题:

我有一个函数,例如获取一些参数:

import argparse

default_1 = 1
default_2 = [12, 34]

parser = argparse.ArgumentParser()
parser.add_argument("I", type=int)
parser.add_argument("N")
parser.add_argument("P", nargs='?', default=default_2)
parser.add_argument("C", nargs='?', type=int, default=default_1)
args = parser.parse_args()

def testfunc(I, N, ARG1=default_1, ARG2=default_2):
    print(I, N, ARG1, ARG2)

testfunc(args.I, args.N, ARG1=args.C, ARG2=args.P)

当我用

从 shell 调用它时
>>> python3.2 test.py 2 foo
2 foo 1 [12,34]

这是我所期望的。但是如果我添加一个 C 5 参数:

>>> python3.2 test.py 2 foo C 5
3 foo 5 C

而不是

3 foo 5 [12, 34]

这肯定是因为我搞砸了 argparse。

下一个奇怪的事情是,当我从我的其他文件 test2.py 中调用此函数 (python3.2 test2.py) 时,如下所示:

from test.py import testfunc
testfunc(2, 'bar')

returns我:

usage: test2.py [-h] I N [P] [C]
test2.py: error: too few arguments

更新 #1: 当我在 test.py 文件中删除 args = parser.parse_args()(或对其进行注释)时,import testfunc 起作用。为什么会这样?

更新#2: 我更接近问题的核心(这至少是我想思考的......) - with (in the test.py):

import sys
print(sys.argv[0])

我得到 test2.py 作为输出,我认为我会得到 test.py - 所以来自包含的函数的 argparser 仍然认为有命令行参数被推倒了。我该如何防止这种情况发生?

请记住,如果您提供的位置参数多于 'extra' 位置参数按顺序成为关键字参数的定义。

def function(arg1, arg2=None):
    if arg2:
        return arg1 + arg2
    else:
        return arg1


assert function(1, 2) == function(1, arg2=2)
assert function(1) == function(1, 0) == function(1, arg2=0)
assert not ''  #  Empty string is falsy

如果你用过

print(args)

而不是 testfunc 解析可能更清晰。我希望它显示

Namespace(I=2, N='foo', P='C', C=5)

即把2, foo, C, 5分别赋值给I, N, P, C

您似乎将 argparse 分配的默认值与 testfunc 关键字参数使用的默认值混合在一起。


我怀疑您希望 C 5 被解释为 'assign 5 to argument labeled C'。但这不是处理位置参数的方式。如果您定义了 -p-c 参数,那么您可以使用:

2 foo -c 5

并获得了所需的行为