4

ペイロードは、インバーターからの読み取り値を表すコンマ区切りのデータチャンクです。これらの読み取り値は、InverterHistoryというテーブルに保存する必要があります。各フィールドに常に値があるとは限りません。モデルは、フィールドにnull/blankを許可するようにすでに設定されています。そのため、フィールドに割り当てる前に、値が存在するかどうかを確認しようとしています。これが私がこれまでに持っているものです:

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(...)オブジェクトを作成していて、コンストラクターに渡すパラメーターです。Pythonでオブジェクトを作成することは、関数やメソッドを呼び出すようなものであり、括弧内にロジックを入れることはできません。したがって、ステートメントをそこに配置するのは構文が正しくないため、エラーが発生します。InverterHistory...if

必要なのは、ロジックを括弧から外し、すべての変数をPython内に配置することですdictdict次に、それをパラメータとしてへの呼び出しに渡すことができます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ステートメントの2行前の一致しない括弧が原因です。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 に答える