Python:其他选项与使用“__contains__”相比?有人告诉我我不应该使用它

Python: Other options versus using '__contains__`? I was told I should not use it

我有一个工作文件[如下],但我想知道前三行是否有更好的解决方案。

我在一个文件夹中有几个文件,还有一个脚本根据每个文件名中的特定和保存 <string> 来处理它们。但是,我被告知我不应该使用 __contains__ (我不是 CS 专业的,也不完全理解为什么)。有更好的选择吗?我找不到任何其他简洁的解决方案。

谢谢。

files = os.listdir (work_folder)
for i in files:
    if i.__contains__('FOO'):
        for i in range (number_of_files):
            old_file = 'C:/path/to/file'
            with open(merged_file, 'a+') as outfile:
                with open(old_file) as infile:
                    for line in infile:
                        outfile.write(line)

一般在Python中,double-underscore方法不应该直接调用;您应该使用与它们相对应的全局函数或运算符。在这种情况下,你会做 if 'FOO' in i.

写的比较平常

if 'FOO' in i:

而不是

if i.__contains__('FOO'):

但是,我会更进一步,并建议您的用例更适合 glob

import glob
foo_files = glob.glob(os.path.join(work_folder, '*FOO*'))

正如 Daniel Roseman 所解释的,double-underscore 方法不是供您调用的,它们是供 Python 解释器或标准库调用的。

所以,这就是您不应该称呼它们的主要原因:它不符合地道,所以会让读者感到困惑。


但你所知道的是,必须有一些打算使用的操作,Python将通过调用 __contains__ 方法来实现。你不知道那个操作是什么。你是怎么找到的?

好吧,你可以去 Stack Overflow,像 Daniel Roseman 这样有帮助的人当然会告诉你。但您也可以在 Python 文档中搜索 __contains__。你会发现 this:

object.__contains__(self, item)

Called to implement membership test operators. Should return true if item is in self, false otherwise.

因此,self.__contains__(item) 是为了 Python 实施 item in self

现在你知道该写什么了:'FOO' in i.


如果您继续阅读那些链接的文档,您会发现 i.__contains__('FOO')'FOO' in i 做同样的事情实际上并不完全正确。对于最常见的情况(包括 i 是一个字符串,就像这里一样),这是正确的,但是如果 i 没有 __contains__ 方法,而是一个可迭代的,或者old-style 序列,in 将使用它们。

所以,这是不直接调用 __contains__ 的另一个原因。如果您稍后在字符串之上添加一些抽象,可能是字素簇的虚拟可迭代对象,它可能无法实现 __contains__,但 in 仍然有效。