我正在用Python编写一个应用程序,它将有许多不同的函数,所以从逻辑上讲,我认为最好将我的脚本拆分成不同的模块。目前,我的脚本读入一个文本文件,其中包含已转换为标记和拼写的代码。然后,该脚本将代码重新构造为一个字符串,并在原始代码中的注释所在的位置使用空行。
不过,我在使脚本面向对象时遇到了问题。无论我怎么尝试,我似乎都不能让程序以相同的方式运行,就好像它只是一个脚本文件。理想情况下,我希望有两个脚本文件,其中一个包含清理和重构文件的类和函数。第二个脚本将简单地调用另一个文件中的类中的函数,该文件是作为命令行中的参数给出的。这是我当前的脚本:
import sys
tokenList = open(sys.argv[1], 'r')
cleanedInput = ''
prevLine = 0
for line in tokenList:
if line.startswith('LINE:'):
lineNo = int(line.split(':', 1)[1].strip())
diff = lineNo - prevLine - 1
if diff == 0:
cleanedInput += '\n'
if diff == 1:
cleanedInput += '\n\n'
else:
cleanedInput += '\n' * diff
prevLine = lineNo
continue
cleanedLine = line.split(':', 1)[1].strip()
cleanedInput += cleanedLine + ' '
print cleanedInput
按照Alex Martelli下面的建议,我现在有了下面的代码,它给出了与我的原始代码相同的输出。
def main():
tokenList = open(sys.argv[1], 'r')
cleanedInput = []
prevLine = 0
for line in tokenList:
if line.startswith('LINE:'):
lineNo = int(line.split(':', 1)[1].strip())
diff = lineNo - prevLine - 1
if diff == 0:
cleanedInput.append('\n')
if diff == 1:
cleanedInput.append('\n\n')
else:
cleanedInput.append('\n' * diff)
prevLine = lineNo
continue
cleanedLine = line.split(':', 1)[1].strip()
cleanedInput.append(cleanedLine + ' ')
print cleanedInput
if __name__ == '__main__':
main()
不过,我仍然希望将我的代码拆分成多个模块。我的程序中的“清理过的文件”将会有其他的功能在它上面执行,所以一个清理过的文件自然应该是一个独立的类,对吗?
发布于 2009-11-29 01:28:40
当我进行这种特殊的重构时,我通常从第一个文件中的初始转换开始。步骤1:将功能移动到新类中的方法中。步骤2:添加下面的魔术调用,让文件再次像脚本一样运行:
class LineCleaner:
def cleanFile(filename):
cleanInput = ""
prevLine = 0
for line in open(filename,'r'):
<... as in original script ..>
if __name__ == '__main__':
cleaner = LineCleaner()
cleaner.cleanFile(sys.argv[1])
发布于 2009-11-29 01:39:41
你可以创建一个函数,然后把你所有的逻辑都放在里面。然而,对于完全的“面向对象”,你可以这样做:
ps -您发布的代码在continue
行上有一个错误-它总是被执行,最后2行永远不会执行。
class Cleaner:
def __init__(...):
...init logic...
def Clean(self):
for line in open(self.tokenList):
...cleaning logic...
return cleanedInput
def main(argv):
cleaner = Cleaner(argv[1])
print cleaner.Clean()
return 0
if '__main__' == __name__:
sys.exit(main(sys.argv))
发布于 2009-11-29 01:47:01
如果所呈现的代码都是代码,那么就不要添加任何类!
你的代码太简单了!OOP方法会增加不必要的复杂性。
但如果还是不行的话。将所有代码放入函数中。
def parse_tokenized_input(file):
tokenList = open(file, 'r')
cleanedInput = ''
prevLine = 0
#rest of code
在末尾添加:
if __name__ == '__main__':
parse_tokenized_input(sys.argv[1])
如果代码工作正常,则将函数的def放入新文件(以及所有需要的导入!)例如:mymodyle.py
您的脚本现在将是:
from mymodule.py import parse_tokenized_input
if __name__ == '__main__':
parse_tokenized_input(sys.argv[1])
哦,为你的函数和模块想出更好的名字(模块应该有一个通用的名字)。
https://stackoverflow.com/questions/1813117
复制相似问题