2013-06-28 2 views
2

모듈에서 변수를 노출시키는 가장 좋은 방법은 무엇입니까?파이썬 모듈에서 변수를 노출하는 방법은 무엇입니까?

import otherDBInterface as odbi 

def create(host): 
    global connection 
    global cursor 
    connection = odbi.connect(host) 
    cursor = connection.cursor() 
    ... 

은 내가 mydb.cursor.execute("select * from foo;")처럼 뭔가를 할 수 있도록 모듈의 cursor 변수를 노출합니다. 나는 global 키워드를 사용하여 이렇게 할 것이라고 생각했지만 그런 행운은 없습니다. cursor은 개체이므로 노출 될 수 있도록 어떻게 선언 할 것인지 잘 모르겠습니다.

+1

그렇게해야하지만, 분명히'커서'가 존재하기 전에'create' 함수를 호출해야합니다. 'cursor' 객체를 가져 오거나 사용하려고하는 코드를 보여줄 수 있습니까? – BrenBarn

+0

'mydb'는 모듈 이름입니까? – falsetru

+0

예,이 예에서'mydb'는 모듈 이름입니다. –

답변

4

당신은 모듈 수준에서 생성 된 모든 변수는 기본적으로 "노출"되는 클래스

class Database: 

    def __init__(self, **kwargs): 

     if kwargs.get("connection") is not None: 

      self.connection = kwargs["connection"] 

     elif kwargs.get("host") is not None: 

      self.connection = odbi.connect(host) 
      self.cursor = self.connection.cursor() 

mydb = Database(host="localhost") 

results = mydb.cursor.execute("select * from foo") 

#or use it with a connection 

mydb = Database(connection="localhost") 

results = mydb.cursor.execute("select * from foo") 
+2

+1 설명되지 않은 익명 downvote 카운터. 객체에서 캡슐화하는 것은 전역 변수보다 낫습니다. 일반적으로 부팅하는 것이 더 정확합니다. – tripleee

+0

Python 클래스에서 두 개의 "생성자"를 사용할 수 있습니까? 기존 데이터베이스에 연결하기위한'connect()'생성자와 처음부터 데이터베이스를 생성하기위한'create()'생성자가 필요합니다. –

+0

당신이 요구하는 것은 메소드 오버로딩이라고 부르며 자바와 같은 언어는 파이썬이 아니라 파이썬이 있습니다. 파이썬에서는 동적 인수를 사용합니다. – John

1

에 연결 정보를 포장 할 수 있습니다.

configpath = '$HOME/.config' 

class Configuration(object): 

    def __init__(self, configpath): 
     self.configfile = open(configpath, 'rb') 

config = Configuration(configpath) 

변수를 configpath, Configurationconfig과 같습니다

따라서, 이와 같은 모듈은 세 노출 변수를 가질 것이다. 이 모든 것은 다른 모듈에서 가져올 수 있습니다. 에 config.configfile으로 액세스 할 수도 있습니다.

당신은 또한에서 configFile 접근 세계적으로 이런 식으로 할 수 있습니다 :

configpath = '$HOME/.config' 
configfile = None 

class Configuration(object): 

    def __init__(self, configpath): 
     global configfile 
     configfile = open(configpath, 'rb') 

config = Configuration(configpath) 

을하지만 거기에 다른 모듈에서 configfile에 핸들을 얻을 수있는 것처럼 여러 가지 까다로운 문제는이와 함께하고 그 다음 Configuration 내에서 대체됩니다 당신의 원래 핸들은 변경되지 않습니다. 따라서 이것은 변경 가능한 객체에서만 작동합니다.

위의 예에서이 방법으로 전역으로 configfile을 사용하면 매우 유용하지 않습니다. 그러나, 그 같은 config을 사용하면 잘 작동 할 수 있습니다.

관련 문제