对argparse感到困惑

时间:2018-08-01 04:36:25

标签: python python-3.x argparse

我在理解argparse的工作方式时遇到了一些麻烦,并且在阅读文档时仍然遇到一些困难。

def arguments():
parser = argparse.ArgumentParser(description='Test..')
parser.add_argument("-i", "--input-file", required=True, help="input file name")
parser.add_argument("-o", "--output-file", required=True, help="output file name")
parser.add_argument("-r", "--row-limit", required=True, help="row limit to split", type=int)
args = parser.parse_args()

is_valid_file(parser, args.input_file)

is_valid_csv(parser, args.input_file, args.row_limit)

return args.input_file, args.output_file, args.row_limit

def is_valid_file(parser, file_name):
"""Ensure that the input_file exists"""
if not os.path.exists(file_name):
    parser.error("The file {} does not exist".format(file_name))
    sys.exit(1)

def is_valid_csv(parser, file_name, row_limit):
"""
Ensure that the # of rows in the input_file
is greater than the row_limit.
"""
row_count = 0
for row in csv.reader(open(file_name)):
    row_count += 1
if row_limit > row_count:
    parser.error("More rows than actual rows in the file")
    sys.exit(1) 

上面的代码可以正常工作,但是一旦我删除了第5行的“ --row-limit”,我就会得到一个

Traceback (most recent call last):
 File ".\csv_split.py", line 95, in <module>
  arguments = arguments()
 File ".\csv_split.py", line 33, in arguments
  is_valid_csv(parser, args.input_file, args.row_limit)
AttributeError: 'Namespace' object has no attribute 'row_limit'

为什么删除“ --row-limit”会出现此错误?

1 个答案:

答案 0 :(得分:1)

args = parser.parse_args()实际上为每个args调用将一个属性添加到名称空间parser.add_argument中。属性的名称是根据您的参数名称生成的,此处--row-limit转换为row_limit,因为变量名中不能包含破折号。有关详细信息,请参见argparse documentation

因此,当您调用parser.add_argument(..., "--row-limit", ...)时,它将在调用args.row_limit后创建parse_args()。如Amadan所述,您稍后将在代码中使用args.row_limit。但是,如果您从解析器中删除--row-limit参数,则row_limit中将不存在属性args