Python:其他选项与使用“\uu contains\uuuuuu”相比?我被告知我不应该使用

2024-04-20 08:08:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在一个文件夹中有几个文件,还有一个脚本,它根据每个文件名中的特定且保守的<string>来处理这些文件。然而,我被告知我不应该使用__contains__(我不是计算机科学专业的学生,也不完全明白为什么)。有更好的选择吗?我找不到其他简明的解决办法。你知道吗

谢谢。你知道吗

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)

Tags: 文件inforaswithlinefilesopen
3条回答

正如danielroseman解释的那样,双下划线方法不是由您调用的,而是由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 inself, false otherwise.

因此,self.__contains__(item)是Python实现item in self的地方。你知道吗

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


如果你继续阅读这些链接文档,你会发现i.__contains__('FOO')'FOO' in i做的事情并不完全一样。对于最常见的情况也是如此(包括i是字符串的情况,这里就是这样),但是如果i没有__contains__方法,而是iterable或旧式序列,那么in将使用这些方法。你知道吗

所以,这是另一个不直接调用__contains__的原因。如果您稍后在字符串之上添加一些抽象,可能是一个虚拟的、由grapheme集群组成的iterable之类的东西,它可能不会实现__contains__,但是in仍然可以工作。你知道吗

通常在Python中,不应直接调用双下划线方法;应使用与其对应的全局函数或运算符。在本例中,您将执行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*'))

相关问题 更多 >