2014-09-02 4 views
-2

В настоящее время застрял в этой синтаксической ошибке, ошибка выводится ниже кода.Python If Statement - Ошибка синтаксиса

@property 
def data_rows(self): 
    for d in rlgenevautils.to_csv_dict(self.data_file): 
     trade_dt = rlcore.str2dt(d['EventDate']) 
     settle_dt = rlcore.str2dt(d['ActualSettleDate']) 

     yield (str(d['_UDF_SGCP_ID_']) 
       ,str(d['_UDF_Execution_ID_']) 
       ,str(d['_UDF_PB_ID_']) 
       ,str(d['_UDF_Fund_Admin_ID_']) 
       ,str(d['_Portfolio_NameSort_']) 
       ,str(d['_Strategy_Code_']) 
       ,str(d['_LocationAccount_NameSort_']) 
       ,str(d['_Broker_NameSort_']) 
       ,str(d['_Investment_Code_']) 
       ,trade_dt.isoformat(' ') 
       ,settle_dt.isoformat(' ') 
       ,rlcore.str2float(d['ABSQuantityForCalcCurrentFace']) 
       ,max(rlcore.str2float(d['ABSQuantityForCalcCurrentFace']),rlcore.str2float(d['OriginalFace'])) 
       ,rlcore.str2float(d['ABSQuantityForCalcCurrentFace'])/max(rlcore.str2float(d['ABSQuantityForCalcCurrentFace']),rlcore.str2float(d['OriginalFace'])) 
       ,rlcore.str2float(d['Price']) 
       ,rlcore.str2float(d['ABSAccruedInterestForCalcCurrentFace']) 
       ,if str(d['_Investment_InvestmentGroup_']) == "AssetBacked": 
        rlcore.str2float(d['ABSQuantityForCalcCurrentFace']) * rlcore.str2float(d['Price'])/100 
       else: 
        rlcore.str2float(d['NetCashAmount']) 
       ,rlcore.str2float(d['ABSAccruedInterestForCalcCurrentFace']) + rlcore.str2float(d['txtNetCashPreAccrued']) 
      ) 

Traceback (most recent call last): 
    File ".\sg\rec_and_liquidity\geneva_trade.py", line 64 
     ,if str(d['_Investment_InvestmentGroup_']) == "AssetBacked": 
    ^

Код выше, не в состоянии выяснить, что моя синтаксическая ошибка в инструкции if. Сообщение об ошибке будет вставлено как комментарий в ближайшее время

+0

Пожалуйста, измените исходное сообщение с ошибкой. В поле комментариев вырезаются пробелы, которые могут быть полезны при диагностике проблемы. – Kevin

+0

Хорошо, один момент скоро будет обновлен – user3428722

+1

Похоже, вы пытаетесь «уступить» встроенным 'if'. То, что у вас есть, - не правильный синтаксис. [Этот ответ] (http://stackoverflow.com/a/11880682/651848) показывает, как сделать встроенный 'if'. – rkyser

ответ

1

Проблема в том, что вы не можете поставить утверждение в середине выражения.


Для простых случаев, существует if выражение, которое, будучи выражением, могут быть использованы в середине выражения. В вашем случае:

(rlcore.str2float(d['ABSQuantityForCalcCurrentFace']) * rlcore.str2float(d['Price'])/100 
if str(d['_Investment_InvestmentGroup_']) == "AssetBacked" 
else rlcore.str2float(d['NetCashAmount'])) 

Для более сложных случаев перемещения if заявление вверх и хранить временное значение в переменной, а затем использовать эту переменную в выражении (именно так, как вы уже делаете для, каждый, trade_dt):

if str(d['_Investment_InvestmentGroup_']) == "AssetBacked": 
    priceval = rlcore.str2float(d['ABSQuantityForCalcCurrentFace']) * rlcore.str2float(d['Price'])/100 
else: 
    priceval = rlcore.str2float(d['NetCashAmount']) 

... затем просто использовать priceval в yield.


Однако, как бы вы ни решали это, ваш код представляет собой огромный нечитаемый беспорядок. У вас есть как минимум три разных метода конверсии, которые вы используете повторно; если вы обнаружите, что вы форматируете даты или строки или что-то не так, вам нужно будет изменить это в десятках мест. Вероятно, вам лучше было бы сопоставить имена столбцов для типов или конвертеров, а затем просто генерировать значения путем динамического поиска каждого конвертера. Например:

_COLUMNS = {'_UDF_SGCP_ID_': str, 
      '_UDF_Execution_ID_': str, 
      # ... 
      'EventDate': datetime.datetime, 
      # ... 
      } 

_CONVERTERS = {str: str, 
       datetime.datetime: lambda val: rlcore.str2dt(val).isoformat(), 
       # ...} 

def _converted(d, col): 
    val = d[col] 
    converter = _CONVERTERS[_COLUMNS[col]] 
    return converter(val) 

И теперь вы можете просто сделать следующее:

yield(_converted(d, col) for col in (  
    '_UDF_SGCP_ID_', 
    '_UDF_Execution_ID_', 
    # ... 
) 
1

Вы не можете включать if заявление внутри выражения, как это. Если вы хотите, чтобы включить его в выражении, вам необходимо использовать условное выражение :

(rlcore.str2float(d['ABSQuantityForCalcCurrentFace']) * rlcore.str2float(d['Price'])/100) if str(d['_Investment_InvestmentGroup_']) == "AssetBacked" elserlcore.str2float(d['NetCashAmount']) 

Однако это не очень читаемым. Было бы лучше переместить оператор if до yield, назначить результат переменной и использовать эту переменную в yield.

+0

Спасибо! Это намного эффективнее, чем я думал! – user3428722

1

«if» - это инструкция и создание кортежа таким образом, вы можете использовать только выражения.

Измените ваш код следующим образом:

if condition: 
    something 
else: 
    something2 

в

something if condition else something2