目前遇到此语法错误,错误会在代码下方发布。
@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 :(得分: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