fix: @_helpers.positional raises TypeError when decorating functions without default arguments
維護者通常 1 天內回覆
評估
研究方向
Issue 指出 googleapiclient/_helpers.py,並包含一個使用 @_helpers.positional 的重現範例。閱讀 issue 中展示的 positional() 引數推斷,接著執行該 helper 相關的現有測試。完成條件是:裝飾沒有預設引數或沒有參數的函式時不再引發 TypeError,且現有 helper 測試通過。
由索引模型根據 Issue 內容生成。
描述
Problem
When @googleapiclient._helpers.positional is used as a bare decorator without arguments (e.g., @positional) on a callable that does not define default argument values (or takes no parameters), it raises TypeError: object of type 'NoneType' has no len() at function definition time.
Current Behavior
In googleapiclient/_helpers.py, positional() infers the maximum number of positional arguments when called without arguments:
if isinstance(max_positional_args, int):
return positional_decorator
else:
args, _, _, defaults, _, _, _ = inspect.getfullargspec(max_positional_args)
return positional(len(args) - len(defaults))(max_positional_args)
When max_positional_args has no default parameters (or takes 0 parameters), inspect.getfullargspec(max_positional_args).defaults returns None.
Evaluating len(defaults) then raises:
TypeError: object of type 'NoneType' has no len()
Expected Behavior
When @positional is used without arguments on a function without default parameters (such as def func(a, b): ...), defaults should default to an empty sequence (e.g., len(defaults or ())), correctly calculating len(args) - 0 = len(args) positional parameters instead of crashing with a TypeError.
Reproduction
from googleapiclient import _helpers
@_helpers.positional
def my_function(a, b):
return a + b
Result:
TypeError: object of type 'NoneType' has no len()
Technical Context
In googleapiclient/_helpers.py, replacing len(defaults) with len(defaults or ()) safely treats None as 0 default arguments:
args, _, _, defaults, _, _, _ = inspect.getfullargspec(max_positional_args)
return positional(len(args) - len(defaults or ()))(max_positional_args)
- 主要語言
- Python
- 星號
- 9k
- 分支
- 2.6k
- 平均合併
- 8 小時 36 分鐘
- 30 天內合併 PR
- 7
環境準備
- 沒有 Dockerfile 或 Docker Compose 檔案
- 有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
googleapis/google-api-python-client 的其他 Issue
-
難度 1/5 1 小時以內 新手友好度 88/100
googleapis/google-api-python-client#2844 ·
維護者通常 1 天內回覆
-
Disable prettyPrint by default for Google Sheets API responses可能已有人在做 @pawciobiel 於 69 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 68/100
googleapis/google-api-python-client#2788 ·
維護者通常 1 天內回覆
-
test: connection leak test test_discovery_http_is_closed is shadowed and syntactically invalid可能已有人在做 @Capstan 於 144 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 75/100
googleapis/google-api-python-client#2757 · 1 則留言 ·
維護者通常 1 天內回覆
-
test: strict positional parameter enforcement is ignored under pytest可能已有人在做 @Capstan 於 144 天前認領。 未關閉
難度 1/5 1 小時以內 新手友好度 92/100
googleapis/google-api-python-client#2755 ·
維護者通常 1 天內回覆
-
難度 5/5 一週以上 新手友好度 35/100
googleapis/google-api-python-client#2825 · 1 則留言 ·
維護者通常 1 天內回覆
查看 googleapis/google-api-python-client 的全部 Issue
相似的 Issue
-
難度 2/5 1-3 小時 新手友好度 72/100
CLIMADA-project/climada_python#1337 ·
維護者通常 3 天內回覆
-
難度 2/5 1-3 小時 新手友好度 68/100
8go/matrix-commander#233 ·
-
documentation
難度 2/5 1-3 小時 新手友好度 66/100
-
documentation enhancement priority:high size:M
難度 2/5 1-3 小時 新手友好度 82/100
維護者通常 1 天內回覆
-
Validate non-divisible effective batch sizes in the Unsloth LoRA backend可能已有人在做 @debesh-biswas 今天認領。 未關閉
難度 2/5 1-3 小時 新手友好度 70/100