【问题标题】:local variable 'count' defined in enclosing scope on line 10 referenced before assignment在赋值前引用的第 10 行封闭范围中定义的局部变量“计数”
【发布时间】:2019-08-06 14:13:13
【问题描述】:

我对以下 Python 3 代码有疑问(从底部算起的第 5 行 count=count+1):

import base64
import json
from google.cloud import iot_v1
import os
from twilio.rest import Client

account_sid = os.environ['TWILIO_ACCOUNT_SID']
auth_token = os.environ['TWILIO_AUTH_TOKEN']
client = Client(account_sid, auth_token)
count = 0


def device_config(config):
    client = iot_v1.DeviceManagerClient()
    name = client.device_path(<project_ID>,
                              <Region>,  <Registry>, <Device_ID>)
    binary_data = bytes(config, 'utf-8')
    client.modify_cloud_to_device_config(name, binary_data)


def hello_pubsub(event, context):
    if 'data' in event:
        data = event['data']
        data = base64.b64decode(data)
        data = data.decode('utf-8')
        data = json.loads(data)

        temperature = float(data['temperature'])

        if temperature > 25.0:
            device_config("ledon")
            if count < 1:
                client.calls.create( \
                    url=<URL>,
                    to=os.environ['TWILIO_TO'],
                    from_=os.environ['TWILIO_FROM'])
                count = count+1
        else:
            device_config("ledoff")
    else:
        print("Data is not present!")

这个函数会被连续调用(想象一下像一个无限循环会调用这个函数)。我想在第一次温度超过 25 时将计数更新为 1,对于以后的调用,它可能会达到多高,LED 应该亮,但不应进行调用

【问题讨论】:

  • 需要在hello_pubsub函数的第一行加上global count

标签: python python-3.x


【解决方案1】:

hello_pubsub(event, context) 中,您在count = count+1 行中分配给count。这使得 python 在函数范围内查找 count(它尚未定义,因此在右侧 [count+1] 上查找失败)。

这可能值得一读:https://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html#variable-scope-and-lifetime

你需要告诉python你的意思是全局count

def hello_pubsub(event, context):
    global count
    ...

可能更干净的是:

def hello_pubsub(count, event, context):
    ...

然后调用它:

hello_pubsub(count, event, context)

【讨论】:

  • 我不鼓励使用全局变量
  • @JammyDodger 我也不会(一般来说)。但这可以解释错误并解决问题。
【解决方案2】:

您在函数内部引用count,而它是在外部定义的。您应该将count 作为参数传递。

【讨论】:

【解决方案3】:

您应该将count 作为参数传递给函数,并在将调用该函数的循环中递增它。如果您绝对需要在函数中对其进行赋值,则可以在进行赋值之前使用语句global count

【讨论】:

    【解决方案4】:

    您正试图将局部变量调用到另一个函数中。您还需要将变量传递给函数。希望这会有所帮助!

    account_sid = os.environ['TWILIO_ACCOUNT_SID']
    auth_token = os.environ['TWILIO_AUTH_TOKEN']
    client = Client(account_sid, auth_token)
    global count = 0
    
    
    
    def hello_pubsub(event, context,count):
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2016-11-13
      • 2013-08-02
      • 2011-11-06
      • 2018-01-12
      • 1970-01-01
      相关资源
      最近更新 更多