argparse - 请求已经给出的参数

Posted

技术标签:

【中文标题】argparse - 请求已经给出的参数【英文标题】:argparse - asks for argument that's already been given 【发布时间】:2021-03-10 17:57:44 【问题描述】:

我正在尝试使用以下命令运行我的文件:

python3 file.py -p pony_counts num_words

我的 argparse 代码在哪里:

parser = argparse.ArgumentParser()

parser.add_argument('pony_counts', type=str, help="output file for compute_pony_lang.py")    
parser.add_argument('num_words', type=int, help="num of words we want in the output list for each speaker")
parser.add_argument('-p', action='store_true')

args = parser.parse_args()

with open(args.pony_counts) as f:
    df = json.load(f)
    
df = pd.DataFrame(df) # convert json to df
df = df.drop([i for i in df.index if i.isalpha() == False]) # drop words that contain apostrophe

total_words_per_pony = df.sum(axis=0) # find total no. of words per pony
df.insert(6, "word_sum", df.sum(axis=1)) # word_sum = total occurrences of a word (e.g. said by all ponies), in the 7th column of df
tf = df.loc[:,"twilight":"fluttershy"].div(total_words_per_pony.iloc[0:6]) # word x (said by pony y) / word x (total occurrences)
    
ponies_tfidf = tfidf(df, tf)  
ponies_alt_tfidf = tfidf(df, tf)      

d = 
ponies = ['twilight', 'applejack', 'rarity', 'pinky', 'rainbow', 'fluttershy']

if args.p:
   for i in ponies:
       d[i] = ponies_alt_tfidf[i].nlargest(args.num_words).to_dict()
else: # calculate tfidf according to the method presented in class 
   for i in ponies:
       d[i] = ponies_tfidf[i].nlargest(args.num_words).to_dict()

final = 
for pony, word_count in d.items():
    final[pony] = list(word_count.keys())  

pp = pprint.PrettyPrinter(indent = 2)
pp.pprint(final)

我的代码使用命令运行 - 但是,无论命令是否包含 -p 参数,else 块都会运行。非常感谢帮助,谢谢!

【问题讨论】:

'-p`' 获取 'pony_counts' 字符串。 'num_words' 然后被赋予'pony_counts',没有留下'num_words'。如果您不希望它获取以下字符串,请将“-p”放在最后。 当您还提供defaultconst 参数时,可选的nargs='?' 最有用。 -p 没有意义。为什么是type=str?为什么nargs='?'?为什么长名称 --optional 而不是更符合其描述的名称?它甚至意味着什么?听起来它应该只是一个标志,而不是带参数的东西。 我们没有足够的信息来说明这是应该做什么来告诉你如何去做。 有了这些变化,我认为我们已经无能为力了。我建议添加print(args),以验证解析器是否已完成您想要的操作。然后在 if args.p 块中,再打印一次或 2 以确认执行了哪个块。仅基于 d 值来判断需要更多的知识计算应该做什么。 【参考方案1】:

运行命令:

python3 file.py -p 10

相当于:

python3 file.py -p=10

在 Bash 中(假设您使用的是 Mac 或 Linux),空格被视为与标志后的等号相同。因此,如果您想为 -p 标志传递一个值,您需要将它的结构更像:

python3 file.py -p <tfidf arg> <pony_counts> <num_words>

只是阅读您的代码,也许您希望 -p 成为真/假标志而不是输入?如果是这样,您可以使用action='store_true'action='store_false'。它指出了如何做到这一点in the docs。从文档中提取一个示例:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)

【讨论】:

空格/= 等价不是 Bash 所做的。仅当接收参数的程序实际上将两个版本视为等效时,这种等效性才成立。在这种情况下,它是 argparse 处理的东西。 抱歉。你说得对。是的,等效性取决于处理输入的应用程序,但这通常适用于许多现代 CLI。

以上是关于argparse - 请求已经给出的参数的主要内容,如果未能解决你的问题,请参考以下文章

如果只给出一个参数,则不同的 argparse 规则

Python Argparse 条件需要的参数

Argparse:检查是不是传递了任何参数

如何在单元测试期间测试所需的 argparse 参数?

Argparse 命令行解析模块常用参数

打印所有 argparse 参数,包括默认值