- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试处理一个在 Python 中操作另一个脚本的脚本,要修改的脚本具有如下结构:
class SomethingRecord(Record):
description = 'This records something'
author = 'john smith'
我使用 ast
来定位 description
行号,并使用一些代码根据行号将原始文件更改为新的描述字符串。到目前为止一切顺利。
现在唯一的问题是 description
偶尔是多行字符串,例如
description = ('line 1'
'line 2'
'line 3')
或
description = 'line 1' \
'line 2' \
'line 3'
我只有第一行的行号,没有以下行。所以我的单行替换器会做
description = 'new value'
'line 2' \
'line 3'
并且代码被破坏了。我想如果我知道 description
分配的开始行和结束/行数,我可以修复我的代码来处理这种情况。如何使用 Python 标准库获取此类信息?
最佳答案
我查看了其他答案;当您真正的问题是修改代码之一时,似乎人们正在做后空翻来解决计算行号的问题。这表明基准机制并没有以您真正需要的方式帮助您。
如果您使用 program transformation system (PTS) ,你可以避免很多这样的废话。
一个好的 PTS 会将您的源代码解析为 AST,然后让您应用源代码级别的重写规则来修改 AST,并最终将修改后的 AST 转换回源文本。通常 PTS 接受基本上这种形式的转换规则:
if you see *this*, replace it by *that*
[构建 AST 的解析器不是 PTS。他们不允许这样的规则;您可以编写临时代码来破解树,但这通常很尴尬。他们不使用 AST 来重新生成源文本。]
(我的 PTS,参见 bio,称为)DMS 是可以完成此任务的 PTS。使用以下重写规则可以轻松完成 OP 的具体示例:
source domain Python; -- tell DMS the syntax of pattern left hand sides
target domain Python; -- tell DMS the syntax of pattern right hand sides
rule replace_description(e: expression): statement -> statement =
" description = \e "
->
" description = ('line 1'
'line 2'
'line 3')";
一个转换规则被赋予一个名称replace_description,以将它与我们可能定义的所有其他规则区分开来。规则参数(e:表达式)表示该模式将允许源语言定义的任意表达式。 statement->statement 表示规则将源语言中的语句映射到目标语言中的语句;我们可以使用提供给 DMS 的 Python 语法中的任何其他语法类别。这里使用的"是一个元引用,用来区分规则语言的语法和主题语言的语法。第二个->将源模式 this 与目标模式 that 分开。
您会注意到没有必要提及行号。 PTS 通过使用用于解析源文件的相同解析器实际解析模式,将规则表面语法转换为相应的 AST。为模式生成的 AST 用于实现模式匹配/替换。因为这是由 AST 驱动的,所以原始代码的实际布局(间距、换行符、注释)不会影响 DMS 的匹配或替换能力。注释不是匹配的问题,因为它们附加到树节点而不是树节点;它们被保存在转换后的程序中。 DMS 确实捕获所有树元素的行和精确列信息;只是不需要实现转换。 DMS 也使用该行/列信息将代码布局保留在输出中。
其他 PTS 提供大致相似的功能。
关于python - 如何在 Python ast 中获取 "end-of-statement"的 lineno,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39779538/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!