4

有效载荷是逗号分隔的数据块,表示来自逆变器的读数。这些读数需要存储在一个名为 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

我对python相当陌生,不知道如何正确编码上述内容。当我尝试编译代码时,我在 if 语句开始时遇到错误。我怎样才能修复上面的代码,以便它可以按需要编译和工作?

4

4 回答 4

7

当您编写时i_data = InverterHistory(...),您正在创建一个类型的对象,InverterHistory并且...是您传递给构造函数的参数。在 Python 中构造对象就像调用函数或方法一样,不能将逻辑放在括号内。所以,你会得到一个错误,因为在if那里放置一个语句是不正确的语法。

您需要做的是将逻辑移出括号并将所有变量放入 Pythondict中。然后,您可以将其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)

**params包字典。这意味着解释器将从key: value字典中获取所有内容并将它们转换为key=value. 这样,if语句所针对的每个参数都True将作为命名参数传递给InverterHistory

于 2012-07-11T21:50:24.380 回答
4

您应该在调用方法之前构造参数字典,然后使用 python 关键字 unpack 运算符将字典作为参数传递。

简化示例:

kwargs = {"inverter":i}
if ac_volts_a: 
  kwargs['voltage_ac_a'] = float(ac_volts_a)
i_data = InverterHistory(**kwargs)

相关的 SE 问题: *args 和 **kwargs 是什么意思?

于 2012-07-11T21:28:52.890 回答
1

我不太明白你想要做什么,但错误是因为第一条if语句之前的两行括号不匹配。if调用函数时,参数列表中不能有语句。

于 2012-07-11T21:20:58.847 回答
0

一件事-我认为您不能说def some_func(if blah: x = 0),但您可以将其改写为def some_func(x = 0 if blah else None). 您将替换if thenif then else,但它应该更适合口译员。

所以这部分:

 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"))

所有 if 语句都是“倒退”的。

编辑:

更好的方法可能是这样的:

i_data = InverterHistory(**keywords)

然后在定义中,你使用这个构造:

 def InverterHistory(**kws):
    voltage_ac_a = float(kws.get('ac_volts_a',0.00));

或者

 def InverterHistory(**kws):
    voltage_ac_a = kws.get('ac_volts_a',None);
    voltage_ac_a = float(voltage_ac_a) if voltage_ac_a else None # avoids error if none
于 2012-07-11T21:22:03.317 回答