Python If语句-语法错误

Python If语句-语法错误,python,if-statement,syntax-error,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_I

目前由于这个语法错误,错误被张贴在代码下面

@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语句中的语法错误。错误信息将粘贴为简短的注释

问题是不能在表达式的中间放一个语句。

对于简单的情况,有一个<代码>如果表达式,作为表达式,可以在表达式的中间使用。就你而言:

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

对于更复杂的情况,向上移动
if
语句并在变量中存储一个临时值,然后在表达式中使用该变量(与您已经对每个
trade\dt
执行的操作完全相同):

…然后在
yield
中使用
priceval


然而,无论您如何解决这个问题,您的代码都是一个巨大的无法读取的混乱。您至少有三种重复使用的不同转换方法;如果您发现您正在格式化日期或字符串或任何错误,您将需要在许多地方进行更改。最好将列名映射到类型或转换器,然后通过动态查找每个转换器生成值。例如:

_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_',
    # ...
)

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


然而,这不是很可读。最好将if语句移动到
yield
之前,将结果分配给一个变量,并在
yield
中使用该变量,“if”是一个语句,这样创建元组时只能使用表达式

按如下方式更改代码:

if condition:
   something
else:
   something2


请编辑带有错误的原始帖子。注释框去掉了空格,这在诊断问题时可能很有用。好的,稍等片刻我会快速更新。看起来您正试图使用内联
if
生成。您的语法不正确。演示如何执行内联
if
。谢谢,我现在来看看这个。今天在工作中学习。旁注:把逗号放在行首而不是行尾有点奇怪。谢谢!这比我想象的要有效得多!
(rlcore.str2float(d['ABSQuantityForCalcCurrentFace']) * rlcore.str2float(d['Price']) / 100) if str(d['_Investment_InvestmentGroup_']) == "AssetBacked" elserlcore.str2float(d['NetCashAmount'])
if condition:
   something
else:
   something2
 something if condition else something2