在同一类的另一个函数中获取一个函数的结果

时间:2019-05-03 09:43:23

标签: python function twisted

我在python 3.7中的代码遇到了一个小问题:我想将我从第一个函数(getResult(self,result))的查询中获得的结果与我的'insertMetersCount( )'功能。我该怎么用?

我知道继承不同类别的工作原理,但对于功能而言却不是

from twisted.enterprise import adbapi
from twisted.internet import task
import logging
from datetime import datetime
from twisted.internet import reactor


class MetersCount():

    def getTotalMeters(self):
        log.info("Select operation in Database.")
        getMetersQuery = """ SELECT count(met_id) as totalMeters FROM meters WHERE DATE(met_last_heard) = DATE(NOW()) """

        return dbpool.runQuery(getMetersQuery).addCallback(self.getResult).addErrback(self.errorGetQuery)

    def getResult(self, result):
        print ("Receive Result : ")
        print (result)
        # general purpose method to receive result from defer.
        return result

    def errorGetQuery(self,result):
        print ("error received", result)
        return result

    def insertMetersCount(self):
        log.info("Insert operation in Database.")
        insertMetersQuery = """ INSERT INTO meter_count (mec_datetime, mec_count)  VALUES (NOW(), %s)""" % (self.getResult(result)) 
        return dbpool.runQuery(insertMetersQuery).addCallback(self.getResult)

    def checkDB(self):
        self.getTotalMeters()
        self.insertMetersCount()

a= MetersCount()

a.checkDB()

reactor.run()

这就是我得到的错误:“ NameError:未定义全局名称'result'。

1 个答案:

答案 0 :(得分:1)

欢迎来到stackoverflow。将来,请尝试发布完整的代码示例。有人可以运行并重现您遇到的问题。另外,张贴您收到的完整错误并解释您期望发生的情况。

您需要将result传递给insertMetersCount。您还可以在使用时给它起一个更好的名称,然后停止使用getResult,它实际上只是身份功能和一些日志记录。另外,请勿将值插值到SQL中。这就是创建SQL注入漏洞的方法。您必须为正在使用的数据库库找到正确的参数样式。我已经离开了“%s”,但可能是“?”或“ \ 1”或其他名称。

    def insertMetersCount(self, meters_count):
        log.info("Insert operation in Database.")
        insertMetersQuery = """ INSERT INTO meter_count (mec_datetime, mec_count)  VALUES (NOW(), %s)"""
        return dbpool.runQuery(
            insertMetersQuery, [meters_count]
        )

然后使用必要的参数调用该方法。您可以使用常规的Deferred API来做到这一点:

    def checkDB(self):
        d = self.getTotalMeters()
        d.addCallback(self.insertMetersCount)
        return d

或使用inlineCallbacks

    from twisted.internet.defer import inlineCallbacks

    @inlineCallbacks
    def checkDB(self):
        meters_count = yield self.getTotalMeters()
        yield self.insertMetersCount(meters_count)

这两个都安排完全相同的事情发生。它们只是两个不同的API。