2012-01-08 48 views
1

我知道这个问题已经被一个或两个人问过了,但它与我所想的不同。请多多包涵。如何开始在另一个包装器上编写python包装?

我想写一个包装现有的couchdb-python包装。原因是,如果我们决定在将来切换到另一个NoSQL数据库,例如MongoDB,我只需要更改我的代码库的一部分。

问题1:鉴于上述情况,这是建议的正确的行动方案吗?

访问数据库需要使用couchdb-python包装器访问couchdb的问题,有时(并非所有时间),用户名/密码都是必需的。这就是它看起来像在代码:

server = Server() <---- When no username/password is required 
server = Server('http://abc:[email protected]:5984') <---- When username/password is required 

我将如何界定inital 初始化功能,以应付这两种方案。我现在有这样的想法:

from couchdb import Server 


class Couch(object): 
    """ CouchDB Wrapper """ 
    COUCHDB_URI = {username_not_provided: 'http://localhost:5984', 
        username_provided: 'http://%s:%[email protected]:5984'} 
    def __init__(self, username=None, password=None): 
     if username and password: 
      self.url = COUCHDB_URI['username_provided'] % (username, password) 
     else: 
      self.url = COUCHDB_URI['username_not_provided'] 
     self.server = Server(self.url) 

我觉得代码看起来很丑,有人能指出我对上述的正确方向吗?

谢谢大家!我非常感谢帮助。

回答

2

这是从larsmans回答你的具体格式问题的答案,但我认为你可能想要采取与此不同的方式。首先创建一个为任何NoSQL后端定义通用接口的Base类可能会更好。例如:

class Database(object): 

    def __init__(self, **kwargs): 
     self.connect(**kwargs) 

    def connect(self, **kwargs): 
     pass 


class Couch(Database): 

    def __init__(**kwargs): 
     super(Couch, self).__init__(**kwargs) 

    def connect(self, username=None, password=None): 
     if username and password: 
      # connect this way 
      pass 
     else: 
      # connect that way 
      pass 

数据库类将定义子类应实现的所有接口方法。这样,你的高级代码就可以假设一个通用的数据库对象,并且你只需要为不同的NoSQL后端定义新的模块。

编辑

你应该看看nonrel Django的:http://www.allbuttonspressed.com/projects/django-nonrel

他们完成Django的这个相同的任务,使用的MongoDB作为他们的主要选择,但你可以添加更多的支持通过为CouchDB实现一些基类。这应该给你一个他们如何完成它的好主意,因为django是相同的想法,在可交换数据库后端使用不可知的ORM层。

1

你可以这样来做:

class Couch(object): 
    URI_TEMPLATE = "http://%slocalhost:5984" 

    def __init__(self, username=None, password=None): 
     if username and password: 
      user_part = "%s:%[email protected]" % (username, password) 
     else: 
      user_part = "" 
     self.url = URI_TEMPLATE % user_part 

虽然这里的缺点是%s不会在URI模板中脱颖而出。

这恐怕不会比这更漂亮。

+0

感谢您的输入,但我确实在寻找答案和JDI答案的组合。我想知道是否有可能将观点授予你们两个人。 – Mark 2012-01-09 02:23:09