当前位置: 首页 > 知识库问答 >
问题:

Python If语句-语法错误

徐麒
2023-03-14

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

@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个答案

唐景山
2023-03-14

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

对于简单的情况,有一个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'])

…然后只需使用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_',
    # ...
)
公西凯捷
2023-03-14

“if”是一条语句,以这种方式创建元组时只能使用表达式。

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

if condition:
   something
else:
   something2

 something if condition else something2
昝唯
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我正在尝试在Go中执行MERGE语句: 但是我得到了这个错误: 在MySQL中也是如此: 怎么了? 问题答案: 不支持,等效的是 插入…在重复的密钥更新上 尝试这个, 但请确保将其设置为或。

  • 问题内容: 为什么Python在第9行的简单语句中给我一个语法错误? Python的版本是: 问题答案: 在Python 3中,print是一个函数,您需要像这样调用它。

  • 我的SQL语句语法有问题,LogCat说问题就在哪里。我哪里错了? 下面是我的代码: 任何帮助或建议都将欣然接受,这是我的项目的最后一块拼图。当我做完这件事我就可以Rest了。提前道谢。

  • 问题内容: 我的sql语句出了什么问题,它说问题在FULL JOIN附近,但是我很困惑: 请温柔些,因为我不是sql Fundi 问题答案: MySQL不提供完全连接,您可以使用 一对LEFT + RIGHT和UNION;或者 使用LEFT,RIGHT和INNER和UNION ALL的三元组 该查询也非常错误,因为您有GROUP BY,但是SELECT列不是聚合的。 将其正确转换为LEFT + R

  • SQL查询: 这是一个旧文件,我试图通过phpMyAdmin在HostGator上运行。我收到一个错误,上面写着: MySQL说:#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以在第5行的“)ENGINE=MyISAM”附近使用正确的语法 更新:如果我将语句更改为this,我仍然会收到错误: 我得到错误: 错误1064 (42000):您的SQL语法有错误;检查与您的