簡體   English   中英

獲取未綁定的本地錯誤:分配下面引用的局部變量“x”

[英]Getting Unbound local Error: local variable 'x' referenced below assignment

我有一個 python flask 應用程序正在從另一個應用程序接收 webhook。 當它接收到 webhook 時,它會通過執行任務(查找某人的可用性)和響應 web 應用程序來響應。 發回響應時,我收到一個未綁定的本地錯誤局部變量“響應”,該變量在賦值下方引用。 看起來在該級別調用響應會導致問題。 任何幫助將不勝感激。

from flask import Flask
from flask import request
from flask import make_response
import logging
import json
import random
import os
import importlib
import win32com.client
import pywintypes
import datetime
import pythoncom
from gevent.pywsgi import WSGIServer
from gevent import monkey; monkey.patch_all()
import string

pythoncom.CoInitialize()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(message)s')

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    req = request.get_json(silent=True, force=True)
    logger.info("Incoming request: %s", req)
    intent = get_intent_from_req(req)
    logger.info('Detected intent %s', intent)

    if intent == "Check Schedule Next":
        pythoncom.CoInitialize()
        emailparam = req.get('queryResult').get('parameters').get('email')
        datetime1 = req.get('queryResult').get('parameters').get('date-time').get("date_time")
        datetime2=datetime1.replace('T',' ')
        datetime3=datetime2.replace("-04:00", "")
        print(datetime3)
        pythoncom.CoInitialize()
        class MeetingRoom:
            def __init__(self, inputDate, duration, locationMail):
                self.inputDate = inputDate
                self.oOutlook = win32com.client.Dispatch("Outlook.Application")
                self.bookings = self.oOutlook.CreateItem(1)
                self.bookings.Start = inputDate
                self.bookings.Duration = duration
                self.bookings.Subject = 'Follow Up Meeting'
                self.bookings.MeetingStatus = 1
                self.roomRecipient = self.bookings.Recipients.Add(locationMail)

            def checkRoomAvailability(self):
               bookingDateTime = datetime.datetime.strptime(self.inputDate, '%Y-%m-%d %H:%M:%S')
                self.roomRecipient.resolve
                myDate = bookingDateTime.date()
                pywintypeDate = pywintypes.Time(myDate)
                availabilityInfo = self.roomRecipient.FreeBusy(pywintypeDate, self.bookings.Duration, True)
                timeAvailability = []
                newTime = pywintypeDate
                # print(newTime)
                currentTime = datetime.datetime.now()
                for isAvailable in availabilityInfo:
                    # print(newTime, " :: ", isAvailable)
                    if isAvailable == "0" and newTime > currentTime:
                        timeAvailability.append(newTime)
                    newTime = newTime + datetime.timedelta(minutes=self.bookings.Duration)

                # print(availabilityInfo)
                # for value in timeAvailability:
                #     print(value)
                try:
                    index = timeAvailability.index(bookingDateTime)
                    print(emailparam, "is available")
                    response = {
                    'fulfillmentText': emailparam
                    }
                    # self.bookings.Save()
                    # self.bookings.Send()

                except ValueError:
                    for timestamp in timeAvailability:
                        if bookingDateTime <= timestamp:
                            break
                print("I dont see availability for", emailparam, "at", bookingDateTime, " but next available time is ", timestamp)
                x = ("I dont see availability for", emailparam, "at", bookingDateTime, " but next available time is ", timestamp)
                response = {
                    'fulfillmentText': x
                }
                # def bookMeetingRoom():

        if __name__ == '__main__':
            meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
            meetingRoomObj.checkRoomAvailability()
        #response = {
        #    'fulfillmentText': emailparam
        #}

    res = create_response(response)
    return res

def get_intent_from_req(req):
    try:
        intent_name = req['queryResult']['intent']['displayName']
    except KeyError:
        return None

    return intent_name

def get__from_req(req):
    try:
        intent_name = req['queryResult']['intent']['displayName']
    except KeyError:
        return None

    return intent_name


def create_response(response):
    res = json.dumps(response, indent=4)

    logger.info(res)

    r = make_response(res)
    r.headers['Content-Type'] = 'application/json'

    return r

if __name__ == '__main__':
    LISTEN = ('0.0.0.0',8080)
    http_server = WSGIServer( LISTEN, app )
    http_server.serve_forever()

此行在初始化之前引用response

res = create_response(response)

也許確保所有代碼路徑都初始化response變量?

解決方案

您似乎在錯誤的 scope 中創建了response object,請將其從 function checkRoomAvailability中刪除。

在您創建響應checkRoomAvailability后,在 function checkRoomAvailability 內部,像這樣返回它

response = {
                'fulfillmentText': x
            }
return response #ADD THIS LINE

刪除這些行

 if __name__ == '__main__':
        meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
        meetingRoomObj.checkRoomAvailability()

然后添加回 object 創建並在創建響應之前立即調用,如下所示

meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
response = meetingRoomObj.checkRoomAvailability()
res = create_response(response)
return res

建議

You are lacking some fundamental understanding about how python or scope works so I suggest taking a read friend https://docs.python.org/3.3/reference/executionmodel.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM