2012-07-11 3 views
3

페이로드는 인버터에서 판독 한 데이터를 나타내는 쉼표로 구분 된 데이터입니다. 이 판독 값은 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

당신이 i_data = InverterHistory(...) 쓰기 , 당신은 유형 InverterHistory의 객체를 생성하고 ...은 생성자에 전달하는 매개 변수입니다. 파이썬에서 객체를 생성하는 것은 함수 나 메소드를 호출하는 것과 같으며 괄호 안에 로직을 넣을 수 없습니다. 따라서 문법이 올바르지 않으므로 오류가 발생하여 if 문을 입력해야합니다.

당신이해야 할 일은 괄호 밖으로 로직을 옮기고 모든 변수를 파이썬 dict 안에 넣는 것입니다. 그런 다음 InverterHistory에 대한 호출에 dict을 매개 변수로 전달할 수 있습니다.

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 문이 각각의 매개 변수는 의 이름이 지정된 매개 변수로 전달됩니다. InverterHistory

+0

훌륭한 사전을 사용했습니다. 귀하의 대답은 Lycha 's와 유사하지만 더 잘 설명했습니다. 시간과 대답에 감사드립니다. – Linger

1

나는 당신이하려고하는 것을 얻지 못했지만 오류는 첫 번째 if 진술 이전의 두 줄의 일치하지 않는 괄호 때문에 발생합니다. 함수를 호출 할 때 인수 목록 안에 if 문을 사용할 수 없습니다.

+0

닫기 parenthese는 "recordTime = ..."행에 있으며 if 문을 사용할 수는 없지만 x if y else z 명령문. – Kasapo

+0

구문은 어떻게 보이나요? 값이 없으면 else 부분으로 null을 지정합니까? – Linger

+2

''x = some_value some_value else None'' - 위의 답변을 참조하십시오. http://en.wikipedia.org/wiki/Ternary_operation#Python PHP의''x = (some_condition> 0) ? value_if_true : value_if_false'' – Kasapo

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

모든 문이있는 경우 "뒤로".

편집 :

더 좋은 방법이 될 수 있습니다

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 
3

당신에게 :

i_data = InverterHistory(**keywords) 

다음 정의에서,이 구조를 사용 arg를 생성해야한다. ument 사전을 호출 한 다음 python 키워드 unpack 연산자를 사용하여 사전을 인수로 전달하십시오.

간단한 예 :

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

관련 SE 질문 : What does *args and **kwargs mean?

관련 문제