Python If语句 - 语法错误

时间:2014-09-02 18:40:06

标签: python if-statement syntax-error

目前遇到此语法错误,错误会在代码下方发布。

@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语句中的语法错误。错误消息将很快粘贴为评论

3 个答案:

答案 0 :(得分: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 :(得分:1)

您不能在表达式中包含if语句。如果要将其包含在表达式中,则需要使用条件表达式

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

然而,这不是很易读。最好将if语句移到yield之前,将结果赋给变量,并在yield中使用该变量。

答案 2 :(得分:1)

'如果'是一个声明,并以这种方式创建元组,你只能使用表达式。

更改您的代码,如下所示:

if condition:
   something
else:
   something2

 something if condition else something2