导入dict时的NameError

时间:2013-12-28 08:17:31

标签: python dictionary

我有一个脚本,我想从文件中导入一个dict,然后用它来执行函数。

文件codes.py如下:

rf_433mhz = {
        "0x471d5c" : sensor_LaundryDoor,
}

它使用的文件如下:

#!/usr/bin/python

import mosquitto
import json
import time

def sensor_LaundryDoor():
        print "Laundry Door Opened"
        mqttc.publish("actuators", json.dumps(["switch_HallLight", "on"]))

from codes import rf_433mhz

但我得到NameError

Traceback (most recent call last):
  File "sensors.py", line 11, in <module>
    from codes import rf_433mhz
  File "/root/ha/modules/processing/codes.py", line 2, in <module>
    "0x471d5c" : sensor_LaundryDoor,
NameError: name 'sensor_LaundryDoor' is not defined

有什么办法可以做我想做的事吗?似乎没有在codes.py

内部使用该功能

我试图按以下方式致电sensor_LaundryDoor()

def on_message(msg):
        inbound = json.loads(msg.payload)
        medium = inbound[0]
        content = inbound[1]

        if str(medium) == "433mhz":
                try:
                        rf_433mhz[str(content)]()
                except:
                        print "Sorry code " + content + " is not setup"

3 个答案:

答案 0 :(得分:2)

import不是include。它不会将codes.py的源代码转储到您的脚本中;相反,它在自己的命名空间中运行codes.py,几乎就像一个单独的脚本,然后将模块对象或特定模块内容分配给导入所在的命名空间中的名称。在codes.py的命名空间中,没有sensor_LaundryDoor变量。

将代码划分为模块的方式并不是很有用。要了解codes.py,您需要了解其他文件以了解sensor_LaundryDoor是什么。要了解其他文件,您需要了解codes.py以了解您要导入的内容。这种循环依赖会否定模块化代码的大部分好处,即使它不是错误。重新组织代码以修复循环依赖关系,您也可以修复NameError

答案 1 :(得分:0)

问题在于,在您要导入的字典中,您将0x471d5c的值设置为未定义或未在该范围内定义的变量。

这方面的一个例子就是:

Codes.py

#!/usr/bin/python
sensor_LaundryDoor = 'foo'

rf_433mhz = {
        "0x471d5c" : sensor_LaundryDoor,
}

主要文件

#!/usr/bin/python
from test import rf_433mhz

print rf_433mhz["0x471d5c"]

答案 2 :(得分:0)

有很多方法可以解决这个问题,但看起来真正的问题是你正在尝试用Python编写C风格的代码。 Python的方法是在使用它之前在sensor_LaundryDoor中导入codes.py,如果这引入了循环引用,那么这就是设计问题。

也许你需要三个模块events.py和你的主循环,它从codes.py导入dict,它从sensors.py导入函数。