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
仍然有效。
我有一个工作文件[如下],但我想知道前三行是否有更好的解决方案。
我在一个文件夹中有几个文件,还有一个脚本根据每个文件名中的特定和保存 <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 isin
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
仍然有效。