我有一个类需要从字符串中排除的单词列表:
class Cleaner():
def __init__(self, remove_words=None):
self.remove_words = remove_words
def clean(self, line):
return u' '.join[word for word in line not in self.remove_words]
在主文件上我需要阅读要从行中删除的单词:
if __name__ == "__main__":
with open('remove_words') as r:
words = r.read().splitlines()
cleaning = Cleaner(words)
with open('mylines') as f:
lines = f.read()
for line in lines:
print cleaning.clean(line)
所以我需要在创建remove_words
类之前打开Clean
文件。但是,我需要打开几个文件,删除文字,代码快速乱码。所以我添加了一个类来设置Clean
类上的可移动单词:
class Cleaner():
def __init__(self, remove_words=None):
self.remove_words = remove_words
def set_remove_words(self, words):
self.remove_words = words
def clean(self, line):
return u' '.join[word for word in line not in self.remove_words]
所以现在主代码看起来像
if __name__ == "__main__":
with open('remove_words') as r:
words = r.read().splitlines()
# after lots of these open files...
with open('remove_more_words') as r:
more_words = r.read().splitlines()
cleaning = Cleaner()
all_removable_words = words + more_worlds
cleaning.set_remove_words(all_removable_words)
with open('mylines') as f:
lines = f.read()
for line in lines:
print cleaning.clean(line)
然而事情又变得非常混乱。有些情况下,我必须打开并传递一个可移动单词列表,有时会有几个。什么是" pythonic"这个解决方案?将具有可移动单词的文件名移动到构造函数并构建列表中的更多" pythonic"并且不易出错?应该在哪里处理例外情况?
答案 0 :(得分:1)
首先,好好保持文件I / O不在课堂上。我喜欢你如何遵守鲍勃叔叔的清洁架构原则。您绝对不应将其移动到构造函数中,因为这会将您的域规则代码耦合到open
函数,从而降低其可重用性。
我会将列表推导和生成器用作Pythonic。
if __name__ == "__main__":
bad_word_sources = ['remove_words',...,'remove_more_words']
bad_word_files = (open(source) for source in bad_word_sources)
bad_words = [word for word in chain(bad_word_files)]
cleaning = Cleaner(bad_words)
这是有效的,因为open()
函数提供的__iter__
实现类似于
[line for line in file.readlines()]
当open
对象用尽时,它会自行关闭[需要引用]。
我不确定您希望处理哪种例外情况,您是否可以对此更加具体?
另请注意,set_words
方法被视为unpythonic。如果必须,只需直接设置属性。
另外注意这个班级only has 2 methods, one of which is __init__
:
class Cleaner():
def __init__(self, remove_words=None):
self.remove_words = remove_words
def clean(self, line):
return u' '.join[word for word in line not in self.remove_words]
使这种可重复使用的Pythonic方法是放弃课程并将其放入模块中:
<强> cleaner.py 强>
def clean(line, bad_words):
return u' '.join(word for word in line if line not in self.bad_words)
然后您可以像:
一样使用它from cleaner import clean
而不是:
from cleaner import Cleaner
mycleaner = Cleaner(bad_words)
mycleaner.clean(line)
真的很混乱。
答案 1 :(得分:1)
有些情况下,我必须打开并传递一个可移动单词列表,有时会是几个。什么是&#34; pythonic&#34;这个解决方案?
我认为你需要的是动态参数/参数。
class Cleaner():
def __init__(self, *remove_words):
self.remove_words = []
[self.remove_words.extend(one) for one in remove_words]
def clean(self, line):
return u' '.join[word for word in line not in self.remove_words]
还有另一种方法,** argw,对于一个关键字参数,您可以为参数dict指定一个名称。