有效负载是逗号分隔的数据块,代表来自逆变器的读数。这些读数需要存储在名为InverterHistory的表中。每个字段都不会总是有一个值。该模型已经设置为允许字段为空/空白。因此,我试图在将其分配给字段之前检查是否存在一个值。这是我到目前为止的内容:
i = Inverter.objects.get(mac=u)
payload.reverse()
try:
ac_volts_a = str(payload.pop())
ac_volts_b = str(payload.pop())
ac_volts_c = str(payload.pop())
ac_current_a = str(payload.pop())
ac_current_b = str(payload.pop())
ac_current_c = str(payload.pop())
dc_volts = str(payload.pop())
dc_current = str(payload.pop())
kw_out = str(payload.pop())
mwh_total = str(payload.pop())
current_time = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
i_data = InverterHistory(
inverter = i,
if ac_volts_a:
voltage_ac_a = float(ac_volts_a),
if ac_volts_b:
voltage_ac_b = float(ac_volts_b),
if ac_volts_c:
voltage_ac_c = float(ac_volts_c),
if ac_current_a:
current_ac_a = float(ac_current_a),
if ac_current_b:
current_ac_b = float(ac_current_b),
if ac_current_c:
current_ac_c = float(ac_current_c),
if dc_volts:
voltage_dc = float(dc_volts),
if dc_current:
current_dc = float(dc_current),
if kw_out:
kwout = float(kw_out),
if mwh_total:
mwh = float(mwh_total),
recordTime = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"))
i_data.save()
except Exception, e:
print >> sys.stderr, "Error While Recording Inverter History"
print >> sys.stderr, e
raise Http404
Run Code Online (Sandbox Code Playgroud)
我是python的新手,不知道如何正确编写上述代码。当我尝试编译代码时,如果if语句开始出现错误。我该如何修复以上代码,使其能够按需编译和工作?
您应该在调用方法之前构造参数字典,然后使用 python 关键字 unpack 运算符将字典作为参数传递。
简化示例:
kwargs = {"inverter":i}
if ac_volts_a:
kwargs['voltage_ac_a'] = float(ac_volts_a)
i_data = InverterHistory(**kwargs)
Run Code Online (Sandbox Code Playgroud)
相关SE问题: *args和**kwargs是什么意思?
在编写时i_data = InverterHistory(...),您正在创建一个类型为的对象,InverterHistory并且...是您传递给构造函数的参数。在Python中构造对象就像调用函数或方法一样,您不能在括号内放入逻辑。因此,您得到一个错误,因为在此处放置if语句的语法不正确。
您需要做的是将逻辑移出括号,并将所有变量放入Python中dict。然后,您可以将该dict参数作为参数传递给InverterHistory。
params = {
'inverter': i,
'recordTime': datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
}
if ac_volts_a:
params['voltage_ac_a'] = float(ac_volts_a)
if ac_volts_b:
params['voltage_ac_b'] = float(ac_volts_b)
# Do the same with all your attributes
# ...
# Then you can create your object and pass it the dictionary you have created
i_data = InverterHistory(**params)
Run Code Online (Sandbox Code Playgroud)
在**params解压缩字典。这意味着解释器将从key: value字典中提取所有内容并将其转换为key=value。这样,if语句所针对的每个参数都True将作为命名参数传递给InverterHistory
| 归档时间: |
|
| 查看次数: |
3097 次 |
| 最近记录: |