方法同时返回自身和一个值

Method returning itself and a value at the same time

我正在 mysql 连接器之上创建 python 包装器。到目前为止一切都很简单:

class DBconnector:
    def __init__(self, columns=None, values=None):
        #connect to db
        pass

    def getcolumns(self, database=None):
        columns = ("columnA1", "columnA2")
        return columns

    def getvalues(self, table=None, columns=None):
        values = ("valB1", "valB2")
        columns = columns
        return values

    def getprimary_key(self, table=None):
        table_key = "someTableKey"
        return table_key

db_conn = DBconnector()
mycolumns = db_conn.getcolumns()
myvalues = db_conn.getvalues()
mykey = db_conn.getprimary_key()
print(mycolumns, myvalues, mykey)
>>>> ('columnA1', 'columnA2') ('valB1', 'valB2') someTableKey

现在,我想实现链式方法,如 .as_list().as_dict() 等...这将使我能够在某些情况下以我需要的方式获取数据。例如,当我询问 db_conn.getvalues.asdict() 时,我将获得值和列作为键。 我可以这样实现它:

class DBconnector:
    def __init__(self, columns=None, values=None):
        #connect to db
        self.columns = columns
        self.values = values

    def getvalues(self, table=None, columns=None):
        self.values = ("valB1", "valB2")
        self.columns = columns
        return self

    def __repr__(self):
        return str(self.values)

    def asdict(self):
        mydict = {}
        for idx, col in enumerate(self.columns):
            mydict[col] = self.values[idx]
        return mydict

db_conn = DBconnector()
mycolumns = db_conn.getvalues(columns=["mycolumn1", "mycolumn2"])
print(mycolumns)
print(type(mycolumns))

mydictcolumns = mycolumns.asdict()
print(mydictcolumns)

>>>> ('valB1', 'valB2')
>>>> <class '__main__.DBconnector'>
>>>> {'mycolumn1': 'valB1', 'mycolumn2': 'valB2'}

但我对这种方法几乎没有问题和疑问:

Main 方法 getvalues() 将 return 仅是我无法再直接解析的对象,我将不得不实现其他方法来获取像 .values() (?) 这样的值。 总的来说,我不确定如何不过分复杂,使其用户友好和可读。设计这种 class/module 的正确方法是什么?

虽然您的意图是好的(“友好且可读”),但实施令人怀疑:

class DBconnector:
    def __init__(self, columns=None, values=None):
        #connect to db
        self.columns = columns
        self.values = values

    def getvalues(self, table=None, columns=None):
        self.values = ("valB1", "valB2")
        self.columns = columns
        return self

您使用 columnsvalues 启动了数据库连接器?连接器应该允许读取和写入数据库,为什么值?如果选择从数据库中读取内容会怎样。连接器中的 table 名称在哪里?原始代码非常混乱,希望您可以将其重构为更具可读性的代码。

对于 Stack Overflow https://whosebug.com/help/mcve 也更容易回答,下次尝试让您的问题更有针对性。

如果只有你的问题而没有代码,我会说创建一个连接器 return 本机数据库查询结果类型,并在 class 之外保留一个单独的函数以将此结果转换为不同的类型(例如元组到字典)。

一般来说,我认为数据库连接的一个非常简单的介绍是 https://dataset.readthedocs.io/en/latest and also https://ponyorm.com 用于快速进入 ORM 领域。