Получение результата функции в другой функции того же класса - PullRequest
0 голосов
/ 03 мая 2019

У меня небольшая проблема с моим кодом в 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 Ответ

1 голос
/ 03 мая 2019

Добро пожаловать в 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 для этого.

...