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