在主函数中调用函数

时间:2017-04-25 00:43:18

标签: python

我编写了一个程序,想要调用main中的函数。但是,我一直在收到一个SyntaxError。我不确定我做错了什么。这是我的代码,我尝试了一些东西,但主函数不会调用其余的函数。

class Matrix(object):
    def open_file():
        '''Opens the file if it exists, otherwise prints out error message'''
        Done = False
        while not Done: 
            try:
                File = input("Enter a filename: ").lower() #Asks user for a file to input
                Open_File = open(File, "r") #Open the file if it exists and reads it 
                Info = Open_File.readlines()[1:]
                Open_File.close() #Close the file 
                Done = True #Exits the while loop 
            except FileNotFoundError:
                print("Sorry that file doesn't exist!") #prints out error message if file doesn't exist
            return Info #Info is the file_pointer(fp)

    def __init__(self):  # This completed method is given
        '''Create and initialize your class attributes.'''
        self._matrix = {} #Intialize the matrix
        self._rooms = 0 #Set the rooms equal to zero

    def read_file(self, Info): #Info is equvalient to the file pointer or fp
        '''Build an adjacency matrix that you read from a file fp.'''
        self._rooms = Info.readline()
        self._rooms = int(self._rooms)
        for line in Info:
            a, b = map(int, line.split())
            self._matrix.setdefault(a, set()).add(b)
            self._matrix.setdefault(b, set()).add(a)

        return self._rooms and self._matrix

    def __str__(self):
        '''Return the adjacency matrix as a string.'''
        s = str(self._matrix)
        return s  #__str__ always returns a string

    def main(self):
        matrix = Matrix()
        info = matrix.open_file()
        matrix.read_file(info)
        s = str(matrix)
        print(s)

if __name__ == '__main__':
   m = Matrix()
   m.main()

4 个答案:

答案 0 :(得分:1)

一些事情:

  • 它是self.read_file,而不只是read_file。这是一种实例方法,因此您需要使用self
  • __init__(self)相同,您需要致电self.__init__。虽然通常不会手动执行此操作。您可以通过Matrix()“实例化”课程。
  • 您无法分配给函数调用,因此open_file() = Info根本没有意义。也许你的意思是info = open_file()

看起来你对如何布置班级感到有点困惑。尝试离开课程的main ,就像这样(未经测试):

def main:
    matrix = Matrix()
    info = matrix.open_file()
    matrix.read_file(info)
    s = str(matrix)
    print(s)

您还需要将if __name__ == '__main__'置于全球范围内。

答案 1 :(得分:0)

您的计划条目中有错误。 '如果名称 ==' 主要':'不应包含在班级中。它应该是全球性的。另外,你想调用Matrix的成员函数,但Matrix的对象在哪里。以下代码是正确的:

Class Matrix(object):
#################
        your codes
#################
 if __name__ == '__main__':
        m = Matrix()
        m.main()              

答案 2 :(得分:0)

理想情况下,您可能想要写下面的内容。此外,您的open_file()必须重写。

class Matrix(object):
    def open_file(self):
        File = input("Enter a filename: ").lower() #Asks user for a file to input 
        fp = open(File, "r") 
        return fp

#### Your matrix class code goes here

def main():
    myMatrix = Matrix()
    fp = myMatrix.open_file()
    ret = myMatrix.read_file(fp)
    print(myMatrix)


if __name__ == "__main__": 
    main()

答案 3 :(得分:0)

发布方式

if __name__ == "__main__": 
    main()

将在定义类时执行 - 而不是在程序运行时执行。如上所述,该类将不会被实例化,因此没有Matrix对象可以调用main()

您需要将调用移出一个缩进,因此它与类定义对齐,然后在调用其main()之前创建一个对象:

  if __name__ == "__main__": 
    instance = Matrix()
    instance.main()

你还在main()中向后收到了作业。它应该更像这样:

 info = open_file()
 self.read_file(Info)
 s = __str__(self)
 print(s)

open_file()方法也存在一些问题。你想在你的循环范围之外创建Info,这样你就知道你已经让它返回了。你的评论表明Info应该是文件指针 - 但它并不像你写的那样。 Open_File是文件指针,Info是文件的内容(至少除了第一行之外的所有内容)。除非您期望获得大量数据,否则传递内容可能更容易 - 或者将open_fileread_file组合到同一个函数中。

您还希望使用常用的python模式来打开和关闭with上下文管理器 - 这将为您关闭文件的文件。

在一个包中加入了Open_fileRead_file的快速而脏的版本。

def read_file(self):

   #get the filename first
   filename = None
   while not filename: 
       user_fn = input("Enter a filename: ").lower()
       if os.path.exists(user_fn):
           filename = user_fn
       else:
           print ("Sorry that file doesn't exist!") 

   # 'with' will automatically close the file for you
   with open(filename, 'rt') as filepointer:
       # file objects are iterable:
       for line in filepointer:
           a, b = map(int, line.split())
           self._matrix.setdefault(a, set()).add(b)
           self._matrix.setdefault(b, set()).add(a)

我不清楚self._matrix.setdefault(a, set()).add(b)在这里应该为你做些什么,但在句法术语中你可以简单地将结构“获取文件名,用with打开,迭代它”