在Python中运行多个函数

2024-06-08 02:35:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,它读入一个文本文件,取出必要的变量,将其序列化为turtle格式并存储在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()

Tags: selfforreturndeflineprocessnumat
3条回答

你的问题主要是关于什么是面向对象编程的问题。我会尽量快速解释,但我建议你读一本关于它的适当的教程 http://www.voidspace.org.uk/python/articles/OOP.shtmlhttp://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实例。你在self上设置的每个变量。在WordNet中,存储在该实例中。比如说自.graph如果您调用mywordnet的任何方法,则始终可用。如果你不把它储存在自.graph,则需要在每个需要它的方法(函数)中将其指定为参数。如果所有这些方法调用都需要相同的图,这将是乏味的。在

所以换个角度来看:一切都是你自己设定的。可以看作是Wordnet特定实例的一种配置。它影响Wordnet的行为。例如,可以有两个Wordnet实例,每个实例都用不同的图形实例化,但所有其他功能都相同。这样你就可以根据你使用的Wordnet实例来选择要打印到哪个图形,但其他的一切都保持不变。在

我希望这能帮你一点忙。在

有一件事对你很有帮助,那就是一个好的可视化调试器。{a1免费的一条Python。在商业产品IntelliJ IDEA/PyCharm、Komodo IDE、winged和visualstudio(使用Python工具插件)中也有优秀的调试器。可能还有其他一些人。在

我强烈建议您设置这些调试器之一并在其下运行代码。它可以让你一行一行地检查代码,看看所有变量和对象都发生了什么。在

你应该告诉那些不需要或者不需要调试的人。不要听他们说:一个好的调试器是帮助你学习新语言或熟悉一段代码的最好工具之一。在

首先,我建议你自己找出基本的功能分解——根本不用担心编写一个类。在

例如

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),但从不使用它们的值。如果打电话的人还不知道他们是什么,为什么要把他们传进来?在

因此,一个自由函数应该看起来像:

^{pr2}$

如果你想把这个函数放在你的类作用域中(这样它就不会污染顶级命名空间,或者仅仅因为它是一个逻辑分组),如果不使用它,你仍然不需要传递self。可以使其成为静态方法:

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

相关问题 更多 >

    热门问题