在Python中运行多个函数

时间:2013-06-21 09:12:19

标签: python

我有一个程序在文本文件中读取并取出必要的变量以序列化为乌龟格式并存储在RDF图中。我的代码很粗糙,我被建议将它分成函数。由于我是Python的新手,我不知道如何做到这一点。以下是该计划的一些功能。

我很困惑何时应该将参数传递给函数以及何时应该使用self.初始化参数以下是我的一些函数。如果我能得到一个关于我做错了什么的解释,那就太好了。

#!/usr/bin/env python

from rdflib import URIRef, Graph
from StringIO import StringIO
import subprocess as sub

class Wordnet():

    def __init__(self, graph):
        self.graph = Graph()

    def process_file(self, file):
        file = open("new_2.txt", "r")
        return file

    def line_for_loop(self, file):
        for line in file:
            self.split_pointer_part()
            self.split_word_part()
            self.split_gloss_part()
            self.process_lex_filenum()
            self.process_synset_offset()
            +more functions............
            self.print_graph()

    def split_pointer_part(self, before_at, after_at, line):
        before_at, after_at = line.split('@', 1)
        return before_at, after_at

    def get_num_words(self, word_part, num_words):
        """ 1 as default, may want 0 as an invalid case """
        """ do if else statements on l3 variable """
        if word_part[3] == '0a':
            num_words = 10
        else:
            num_words = int(word_part[3])
        return num_words

    def get_pointers_list(self, pointers, after_at, num_pointers, pointerList):
        pointers = after_at.split()[0:0 +4 * num_pointers:4]
        pointerList = iter(pointers)
        return pointerList

    ............code to create triples for graph...............

    def print_graph(self):
        print graph.serialize(format='nt')

    def main():
        wordnet = Wordnet()
        my_file = wordnet.process_file()
        wordnet.line_for_loop(my_file)

if __name__ == "__main__":
    main()

3 个答案:

答案 0 :(得分:3)

你的问题主要是关于面向对象编程是什么的问题。我会尽快解释,但我建议你阅读一个适当的教程 http://www.voidspace.org.uk/python/articles/OOP.shtml http://net.tutsplus.com/tutorials/python-tutorials/python-from-scratch-object-oriented-programming/ 和/或http://www.tutorialspoint.com/python/python_classes_objects.htm

当你创建一个类并实例化它时(使用mywordnet = WordNet(somegraph)),你可以多次重新启动mywordnet实例。您在自己设置的每个变量。在WordNet中,存储在该实例中。因此,例如,如果您调用mywordnet的任何方法,则self.graph始终可用。如果不将它存储在self.graph中,则需要将其指定为需要它的每个方法(函数)中的参数。如果所有这些方法调用都需要相同的图形,这将是乏味的。

所以以另一种方式看待它:你用自己设定的一切。可以看作是Wordnet特定实例的一种配置。它会影响Wordnet的行为。例如,您可以拥有两个Wordnet实例,每个实例都使用不同的图形进行实例化,但所有其他功能都相同。这样您可以选择要打印到哪个图表,具体取决于您使用的Wordnet实例,但其他所有内容都保持不变。

我希望这能帮到你一点点。

答案 1 :(得分:0)

首先,我建议你自己弄清楚基本的功能分解 - 不要担心写一个类。

例如,

def split_pointer_part(self, before_at, after_at, line):
    before_at, after_at = line.split('@', 1)
    return before_at, after_at

不会触及任何实例变量(它永远不会引用self),所以它可以只是一个独立的函数。

它还展示了我在其他代码中看到的特性:你传递了两个参数(before_atafter_at)但从不使用它们的值。如果来电者还不知道他们是什么,为什么要把他们传入?

所以,自由函数应该看起来像:

def split_pointer_part(line):
    """get tuple (before @, after @)"""
    return line.split('@', 1)

如果你想把这个函数放在你的类范围内(所以它不会污染顶级命名空间,或者只是因为它是一个逻辑分组),你仍然不需要传递self它没有被使用。你可以把它变成一个静态的方法:

@staticmethod
def split_pointer_part(line):
    """get tuple (before @, after @)"""
    return line.split('@', 1)

答案 2 :(得分:0)

对您来说非常有用的一件事是一个很好的可视化调试器。 Python有一个很好的免费版本Winpdb。商业产品IntelliJ IDEA / PyCharm,Komodo IDE,WingIDE和Visual Studio(以及Python Tools插件)中也有出色的调试器。可能还有其他一些。

我强烈建议您设置其中一个调试器并在其下运行代码。它将让您逐行浏览代码,看看所有变量和对象会发生什么。

您可能会发现有人告诉您真正的程序员不需要或不应该使用调试器。不要听他们:一个好的调试器是帮助你学习一门新语言或熟悉一段代码的最好的工具之一。