抓住了argparse和import函数之间的某个地方

时间:2015-09-15 16:07:08

标签: python function python-3.x include argparse

这是我的问题:

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

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来解决问题。

接下来奇怪的是,当我从我的其他文件python3.2 test2.py中调用此函数(test2.py)时,这样:

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

给我回复:

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

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

更新#2: 我更接近问题的核心(这至少是我想要的......) - (在test.py中):

import sys
print(sys.argv[0])

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

2 个答案:

答案 0 :(得分:1)

如果您使用

print(args)

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

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

也就是说,它分别将2, foo, C, 5分配给I, N, P, C

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

我怀疑您希望将C 5解释为'将5分配给标记为C的参数'。但这并不是如何对待位置论证。如果您已定义-p-c参数,那么您可以使用:

2 foo -c 5

并获得了理想的行为

答案 1 :(得分:0)

请记住,您提供的定位参数多于“额外”定义的定位参数。位置参数按顺序成为关键字参数。

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