如何为函数参数“*argv”添加解析器参数
Posted
技术标签:
【中文标题】如何为函数参数“*argv”添加解析器参数【英文标题】:How to add a parser argument for a function argument '*argv' 【发布时间】:2020-09-14 23:17:26 【问题描述】:我正在尝试在我的命令行上运行以下代码。我需要在我的 Splitter 函数中为我的 *argv 参数添加一个参数解析器。当我尝试按如下方式运行代码时,出现错误: TypeError: splitter() 得到了一个意外的关键字参数 '*argv'。
我想知道是否有更合适的方法来添加这种类型的参数?该参数的目的是允许使用该函数的人从 0-inf 为 *argv 添加参数,我知道它正在按照我想要的方式工作。我只是不知道如何解析参数。
import pandas as pd
import numpy as np
import argparse
def arg_parse():
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--input_file", required = True)
parser.add_argument("-s", "--sep", required=True,)
parser.add_argument("-t", "--target_col", required=True)
parser.add_argument("-n", "--new_col", required = False, default = None)
parser.add_argument("-a", "--*argv", required = False, default = None)
args=parser.parse_args()
return vars(args)
def splitter(input_file, target_col, sep, new_col = None, *argv):
df = pd.read_csv(input_file)
df[target_col] = df[target_col].str.split(sep)
exploded = df.explode(target_col)
exploded[target_col].replace(r'^\s*$', np.nan, regex=True, inplace = True)
exploded.dropna(subset=[target_col], inplace=True)
if new_col == None:
return(pd.DataFrame(exploded[[target_col,*argv]]))
else:
exploded[new_col] = exploded[target_col]
return(pd.DataFrame(exploded[[new_col,*argv]]))
if __name__ == '__main__':
args = arg_parse()
print(splitter(**args))
【问题讨论】:
调试时最好打印args
(在vars
之前和/或之后)。该错误表明命名空间属性名称或键不是您认为的那样。我不确定“*argv”是如何呈现的。
"--*argv"
参数,无论它的真实名称是什么,只是一个普通参数,默认为 None,用户提供的字符串。名称中的“*”与函数调用中的“*args”没有任何联系。
为什么是tabpy
标签?
【参考方案1】:
不要将命令行参数视为是函数参数,而是将值使用作为函数参数。实际调用splitter
时要明确。
另外,不要使用required=True
;如果需要一个参数,它应该是一个位置参数。
def arg_parse():
parser = argparse.ArgumentParser()
parser.add_argument("input_file")
parser.add_argument("target_col")
parser.add_argument("--sep", default=",")
parser.add_argument("-n", "--new_col")
parser.add_argument("argv", nargs="*")
return parser.parse_args()
和
if __name__ == '__main__':
args = arg_parse()
result = splitter(
args.input_file,
args.target_col,
args.sep,
args.new_col,
*args.argv
)
print(result)
然后你的命令行看起来像
yourScript.py -n bar some_file.csv foo arg1 arg2
# First any optional arguments
# Then the required file name and target column
# Finally, any additional arguments for argv
虽然您最初说 --sep
是必需的,但如果您真的在使用 CSV 文件,它应该可能是 ,
。将其保留为可选,但默认为 ,
,可以根据需要覆盖。
【讨论】:
ValueError: 无效的选项字符串 'argv': 必须以字符 '-' 开头以上是关于如何为函数参数“*argv”添加解析器参数的主要内容,如果未能解决你的问题,请参考以下文章