2013-03-30 3 views
0

SimPy를 사용하고 있으며 네트워크를 시뮬레이션하려고합니다.다른 모듈에서 객체 간의 상호 작용을 활성화하는 방법

이 내 주요 모듈 :

from SimPy.Simulation import * 
import node0 
import message0 
import network0 
reload (message0) 
reload (node0) 
reload(network0) 
initialize() 
topology=network0.Network() 
activate(topology, topology.operate()) 
node1=node0.Node(1) 
node1.interface.send(destination='node1') 
simulate(until=25) 

I 클래스 노드의 객체에 의해 활성화되는 클래스 메시지의 객체를 원하는,

class Message(Process): 
    def arrive(self, destination, myEvent=delay): 

     self.destination=destination 
     self.interrupt(topology) 

클래스 Network (topology)의 객체를 interrrupt합니다.

는하지만 오류 받고 있어요 :

NameError: global name 'topology' is not defined 

를 그리고 객체가 글로벌하게하는 방법을 모르겠어요. 파이썬 셸에 토폴로지를 입력하면 개체 토폴로지가 표시되므로 메시지를 볼 수없는 이유는 무엇입니까?

답변

0

저는 Message 클래스가 topology 변수와 다른 모듈에 정의되어 있다는 것이 확실합니다. 파이썬에서 "글로벌"변수라고하는 것은 전역 적 (전역 이름 공간이 하나만 있다는 의미에서)이 아니라 특정 모듈의 네임 스페이스의 맨 위에 있습니다. 따라서 주 모듈의 네임 스페이스에있는 전역 변수 topology은 다른 모듈의 전역 변수로 액세스 할 수 없습니다.

__init__ 메서드에 대한 매개 변수로 토폴로지 값을 Message에 전달하여이 문제를 해결하기위한 제안. 메일이 자신의 코드가 아닌 다른 코드 (예 : Node 클래스)에 의해 생성되는 경우 필요에 따라 사용할 수 있도록 조금 더 전달해야 할 수도 있습니다.

그럴 수 없다면 Message 코드로 가져올 수있는 모듈의 네임 스페이스에 토폴로지 값을 넣을 수 있습니다. 당신이 조심하지 않으면 순환 수입이 일을 망칠 수 있기 때문에 이것은 어질러 질 수 있습니다.