python - TypeError:尝试将参数传递给循环内的函数时,“NoneType”对象不可下标
问题描述
我正在尝试将字典值传递给函数,但出现此错误:
Traceback (most recent call last):
File "check_alarm_status.py", line 33, in <module>
main()
File "check_alarm_status.py", line 18, in main
alarmStatus = read_digital_input.main("i1", adams_ips[n])[0]
TypeError: 'NoneType' object is not subscriptable
我已经在其他脚本中使用了相同的函数,但它在循环内的这个函数中不起作用。这是我的代码:
import read_digital_input
import change_terminal_light
import time
terminales_ips = { "1":"10.102.12.87", "2":"10.102.12.88", "3":"10.102.12.89", "4":"10.102.12.90", "5":"10.107.12.80"}
adams_ips = {"1":"10.102.12.91", "2":"10.102.12.92", "3":"10.102.12.93", "4":"10.102.12.94", "5":"10.107.12.82"}
previous_state = [0, 0, 0, 0, 0]
state = [False, False, False, False, False]
APAGADO = 0
ENCENDIDO = 5
aux = 0
def main():
while True:
for n in adams_ips:
alarmStatus = read_digital_input.main("i1", adams_ips[n])[0]
state[int(n)-1] = alarmStatus
print("Alarm status ", n, " = ", alarmStatus)
if state[int(n)-1] is not previous_state[int(n)-1]:
print("Terminal ", n, " changed")
if state[int(n)-1] == True:
print("Encendiendo el terminal", n)
change_terminal_light.main(ENCENDIDO, terminales_ips[n])
elif state[int(n)-1] == False:
print("Apagando el terminal", n)
change_terminal_light.main(APAGADO, terminales_ips[n])
previous_state[int(n)-1] = state[int(n)-1]
time.sleep(0.5)
if __name__ == "__main__":
main()
我见过类似的错误,但我无法解决这个问题。
编辑 这里是 read_digital_input.py (我正在使用它与其他脚本一起使用):
import time
from pyModbusTCP.client import ModbusClient
port = "502"
coil_dictionary = {
"i0": 0,
"i1": 1,
"i2": 2,
"i3": 3,
"i4": 4
}
def main(coil, host):
print(host)
try:
c = ModbusClient(host, port)
c.open()
state = c.read_coils(coil_dictionary[coil])
return state
except ValueError:
print("Error with host or port params")
if __name__ == '__main__':
main()
解决方案
回溯告诉你这一行有错误
alarmStatus = read_digital_input.main("i1", adams_ips[n])[0]
'NoneType' object is not subscriptable
表示您已下标(通过调用 [])一个对象None
,因此很可能
read_digital_input.main("i1", adams_ips[n])
调用返回一个None
。也许你需要检查这是否是一个无,像这样
def main():
while True:
for n in adams_ips:
input = read_digital_input.main("i1", adams_ips[n])
if input is None:
continue
# you may want to do something else than simply skipping here
alarmStatus = alarm[0]
state[int(n)-1] = alarmStatus
print("Alarm status ", n, " = ", alarmStatus)
if state[int(n)-1] is not previous_state[int(n)-1]:
print("Terminal ", n, " changed")
if state[int(n)-1] == True:
print("Encendiendo el terminal", n)
change_terminal_light.main(ENCENDIDO, terminales_ips[n])
elif state[int(n)-1] == False:
print("Apagando el terminal", n)
change_terminal_light.main(APAGADO, terminales_ips[n])
previous_state[int(n)-1] = state[int(n)-1]
time.sleep(0.5)
推荐阅读
- java - 将霍夫曼编码的字符串写入Java文件时如何处理奇数字节?
- python - 测试列表中所有可能性的程序
- javascript - 如何在不知道调用者函数的情况下拦截 javascript 中的 api 调用?
- java - 将依赖项复制到 gradle 中的 libs 文件夹
- linux - Sublime Text:[Errno 2] 没有这样的文件或目录:'gopls'
- html - 将所有输入、标签和选择元素居中
- amazon-dynamodb - aws dynamodb 查询包含特殊字符的属性值?
- laravel - Laravel Postgres SQLSTATE [42601]:语法错误:7 错误:“”“”处或附近的零长度分隔标识符
- c++ - 即使所有数组都被删除 C++,内存仍然泄漏
- python - 为什么我的决策树 ML 算法训练越来越完美?