python / python/cpython

Argparse: inconsistent default handling between `nargs` values

未關閉
#132,717 6 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

docs stdlib type-bug
主要語言
Python
星號
77.2k
分支
36k
PR 合併指標
PR 指標待擷取

描述

Bug report

Bug description:
import argparse

parser = argparse.ArgumentParser(
    formatter_class=argparse.ArgumentDefaultsHelpFormatter
)

day_names = ["mo", "tu", "we", "th", "fr", "sa", "su"]
days = [1, 2, 3, 4, 5, 6, 7]

def name_day(value):
    return day_names.index(value) + 1

parser.add_argument(
    '--day',
    type=name_day,
    default="mo",
    nargs='?',  
    help="pick a day",
)
args = parser.parse_args()
print(args.day)
Actual results:

The above code block will print the value 1. However, if we change the arguments to

    default=["mo"],
    nargs='+',

The code will print the value ["mo"]. So it seems type conversion does not happen for default arguments when nargs specifies multiple arguments.

Expected results:

The supplied default values are converted, irrespective of the value of nargs.

CPython versions tested on:

3.13, 3.10

Operating systems tested on:

Linux

Linked PRs
  • gh-132724

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

首先使用 argparse 重現該範例,並比較 nargs='?' 和 nargs='+' 的預設處理方式。追蹤 argparse 的參數處理入口,查看型別轉換的差異所在,然後驗證對於這兩種形式,所提供的預設值都能以一致的方式進行轉換,並保留預期的解析值。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
cli
Issue 類型
缺陷
難度
3/5
預估耗時
1-2 天
活躍度
停滯
描述清晰度
描述清楚
新手友好度
35/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。