簡體   English   中英

如何在Python中動態選擇和傳遞命名參數?

[英]How to dynamically select and pass named parameters in Python?

payload是一個逗號分隔的數據塊,表示來自逆變器的讀數。 這些讀數需要存儲在名為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語句開始的錯誤。 我如何修復上面的代碼,以便它可以根據需要編譯和工作?

當你編寫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)

**params解包字典。 這意味着解釋器將從字典中獲取所有key: value並將它們轉換為key=value 這樣, if語句為True每個param將作為命名參數傳遞給InverterHistory

您應該在調用方法之前構造參數字典,然后使用python關鍵字unpack運算符將字典作為參數傳遞。

簡化示例:

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

相關的SE問題: * args和** kwargs是什么意思?

我不太了解你要做的事情,但錯誤是因為在第一個if語句之前有兩行不匹配的括號。 調用函數時,不能在參數列表中包含if語句。

有一件事 - 我認為你不能說def some_func(if blah: x = 0)但是你可以把它重寫為def some_func(x = 0 if blah else None) if then你將替換if then if 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM