2014-04-25 2 views
0

У меня есть два модуля под названием Dfs и Graph. В моем модуле Graph у меня есть класс Graph и метод под названием ReadGraph. В моем модуле Dfs, у меня есть метод, который вызывает на ReadGraph, но я получаю следующее сообщение об ошибке при вводе: Dfs.ProcessGraph (testcase.txt, многословно = True)Python Использование методов из других модулей

Сообщение об ошибке: NameError: Имя «TestCase 'не определен

Может кто-нибудь объяснить, как это исправить?

Спасибо.

Из моего модуля Dfs.py:

import sys 
from Graph import * 

class Dfs(object): 

    def ProcessGraph(file_name, verbose): 
     g=ReadGraph(file_name) 

Из моего Graph.py модуля:

class Graph(object): 

    def ReadGraph(file_name): 
+2

Где вы код? Вы «импортируете»? – jonrsharpe

+0

@jonrsharpe: В верхней части моего модуля Dfs у меня есть: from Graph import * – Student

+0

Можете ли вы включить пример минимального кода, который вызывает ошибку? –

ответ

1

Удалите объявление класса от Graph.py. Когда вы импортируете все из файла, вы получаете все объекты верхнего уровня. В этом случае это класс Graph, а не его методы.

Также вам необходимо передать строку 'testcase.txt' не testcase.txt.

1

У вас есть несколько проблем здесь:

  1. Если вы from Graph import * (что плохая практика, чтобы начать с), вы приносите Graph в ваше пространство имен. Однако ReadGraph является внутриGraph, поэтому для него нужен Graph.ReadGraph.
  2. Сделав это, попробуйте позвонить Dfs.ProcessGraph(testcase.txt,verbose=True). Первый аргумент интерпретируется как «передать атрибут txt объекта, на который ссылается имя testcase, который не существует. Вместо этого вы имеете в виду "testcase.txt" (цитируется, чтобы сделать его строкой).
  3. Сделав все это, вы получите например, TypeError: unbound method ProcessGraph() must be called with Dfs instance as first argument (got str instance instead).Когда вы вызываете метод экземпляра, первый аргумент, self по соглашению, является самим экземпляром. У вас есть два варианта: a) сделать, например, ProcessGraph a @staticmethod, и получить к нему доступ Graph.ReadGraph или b) переместить его за пределы класса , то вы можете получить к нему доступ напрямую, как вы пытались в первую очередь. Поскольку у вас нет каких-либо атрибутов класса или экземпляра, неясно, почему вы вообще беспокоитесь о занятиях.

Что это, вероятно, следует выглядеть следующим образом:

import sys 

from Graph import read_graph 

def process_graph(file_name, verbose): 
    g = read_graph(file_name) 

Graph.py модуль (примечание отсутствие class Graph):

def read_graph(file_name): 
    ... 

(Вообще, я предлагаю вам прочитать PEP 8).

+0

Когда я пытаюсь: из Graph import read_graph, я получаю: не могу импортировать имя ReadGraph – Student

+0

Вы уверены? Ошибка не соответствует 'import' ... – jonrsharpe

+0

Да, когда я пытаюсь выполнить компиляцию Dfs.py, я получаю: ImportError: не могу импортировать имя ReadGraph – Student

0

ваш код должен быть: Dfs.ProcessGraph('testcase.txt',verbose=True) и не Dfs.ProcessGraph(testcase.txt,verbose=True)

'testcase.txt' # is a string and should be between quotes 

также проверить, если он находится в той же директории, где ваш код жить еще указывают на него

плюс в ДХ вы должны создать экземпляр Graph:

from Graph.Graph import * 
g = Graph() 
grf = g.ReadGraph('filename') 

EDIT: чтобы быть более точным

в модуле Graph:

class Graph(object): 
    def __init__(self): 
     pass # for the example now 

    def read_graph(self, file_name): 
     return file_name 

в модуле Dfs:

from Graph import * 
class Dfs(object): 
    def __init__(self): 
     pass # for the example now 

    def ProcessGraph(file_name, verbose): 
     g = Graph() 
     file_name = Graph.read_graph(file_name) 
+0

'g.ReadGraph ('filename')' не будет работать без добавления аргумента 'self' или декоратора' @ staticmethod'. – jonrsharpe

Смежные вопросы