为什么 if 测试无法使用我的解析 arg?

Why does if test fail to work with my parsing arg?

我在这里遇到了一个难题,试图弄清楚机器中发生了什么。这是我的代码:

import argparse, sys
from scitools.StringFunction import StringFunction

parser = argparse.ArgumentParser()

parser.add_argument('--f', '--function', type=str, default=None,\
                    help='Function', metavar='f')
parser.add_argument('--fn', '--filename', type=str, default=None,\
                    help='Filename', metavar='fn')

args = parser.parse_args()

print args.f and args.fn == None, type(args.fn), type(args.f)

if args.f and args.fn == str:
    f = StringFunction(args.f); filename = args.fn 
else:
    print 'Failed to provide f, filename or both!'
    sys.exit(1)

运行:--f x**2 --fn somename 在终端中。

现在打印语句产生:

False <type 'str'> <type 'str'>

在我的终端中,但 if 测试给出:

Failed to provide f, filename or both!

紧接着!为什么会这样?

args.fn类型str,但是你测试args.fn是不是本身 等于它的类型。不能两者兼而有之。

您正在这样做:

>>> type('foo')
<type 'str'>
>>> 'foo' == str
False

改用isinstance()

if args.f and isinstance(args.fn, str):

更好的测试是查看 args.fn 是否 而不是 None:

if args.f and args.fn is not None: