导入di时发生名称错误

2024-10-03 23:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,我想从文件中导入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"

Tags: 文件函数frompyimportjsonondef
3条回答

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

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

问题是,在您要导入的词典中,您将0x471d5c的值设置为一个未定义或未在该范围内定义的变量。你知道吗

例如:

你知道吗代码.py你知道吗

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

rf_433mhz = {
        "0x471d5c" : sensor_LaundryDoor,
}

主要文件

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

print rf_433mhz["0x471d5c"]

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

将代码划分为模块的方法不是很有用。理解代码.py,您需要了解另一个文件才能知道sensor_LaundryDoor是什么。要理解另一个文件,您需要理解代码.py知道你要进口什么。这种循环依赖关系将否定模块化代码的大部分好处,即使它不是一个错误。重新组织代码以修复循环依赖关系,可能还会修复NameError。你知道吗

相关问题 更多 >