读取一些文件并通过setter

时间:2015-11-25 00:23:24

标签: python

我有一个类需要从字符串中排除的单词列表:

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"并且不易出错?应该在哪里处理例外情况?

2 个答案:

答案 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指定一个名称。