Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

A minor problem with the section "6.10.2. Membership test operations" from the language reference.

未关闭 适合新手
#159,034 5 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
76/100
Issue 类型
文档
描述清晰度
描述清楚
活跃度
活跃
技术栈
python
领域
documentation

调研方向

阅读语言参考中的“6.10.2. Membership test operations”和“3.3.13. Special method lookup”,将成员资格测试的措辞与“3.3.6.”中的可调用对象示例进行比较。更新描述,以准确反映隐式特殊方法查找,然后对照 issue 中的示例和周边参考文本,核实修订后的措辞。

由索引模型根据 Issue 内容生成。

描述

docs pending
Documentation

The section "6.10.2. Membership test operations" of the language reference contains the following assertion:

For user-defined classes which define the __contains__() method, x in y returns True if y.__contains__(x) returns a true value, and False otherwise.

But it's false; this code:

class _:
    def __contains__(self, y):
        return True
y = _()
y.__contains__ = lambda y: False
x=1
print(y.__contains__(x))
print(x in y)

Will yield

False
True

To be precise, the current description ignores the special method lookup described in section "3.3.13. Special method lookup". Simply changing it to type(y).__contains__(y, x) will not really solve the issue either, as the last example from section 3.3.13 shows:

class Meta(type):
    def __getattribute__(*args):
        print("Metaclass getattribute invoked")
        return type.__getattribute__(*args)

class C(object, metaclass=Meta):
    def __len__(self):
        return 10
    def __getattribute__(*args):
        print("Class getattribute invoked")
        return object.__getattribute__(*args)

c = C()
c.__len__()                 # Explicit lookup via instance
Class getattribute invoked
10
type(c).__len__(c)          # Explicit lookup via type
Metaclass getattribute invoked
10
len(c)                      # Implicit lookup
10

The straightforward fix I can think of is to use the same way of describing it as, say, the "3.3.6. Emulating callable objects" section with:

object.call(self[, args...])
Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, ...) roughly translates to type(x).__call__(x, arg1, ...).

Turning our problematic expression into

For user-defined classes which define the __contains__() method, x in y returns True if the the call to __contains__() method (which roughly translates to type(y).__contains__(y, x)) returns True, otherwise False.

Note that the problem is present from at least Python 3.0 onwards.

Linked PRs
  • gh-159046
主要语言
Python
星标
77.6k
派生
37.6k
平均合并
1 天 20 小时
30 天内合并 PR
608

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

python/cpython 的其他 Issue

查看 python/cpython 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。