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分
- マージ済み PR(30日)
- 7
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- 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 が 72 日前に担当しました。 オープン
難易度 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 が 147 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
googleapis/google-api-python-client#2757 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
test: strict positional parameter enforcement is ignored under pytest対応中かも @Capstan が 147 日前に担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
googleapis/google-api-python-client#2755 ·
メンテナーはふだん 1 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
googleapis/google-api-python-client#2825 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
googleapis/google-api-python-client の issue をすべて見る
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
GoogleCloudPlatform/gce-rescue#195 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 83/100
メンテナーはふだん 1 日以内に返信
-
intake mcp-intake needs-ac needs-human-review priority:medium
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
Ikalus1988/MisakaNet#3848 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 75/100
521xueweihan/HelloGitHub#4105 ·
-
bug size:XS
難易度 2/5 1〜3時間 初心者へのやさしさ 83/100
メンテナーはふだん 1 日以内に返信