我正在使用python 2.6并且在我的长程序中有一堆打印状态。如何用我的自定义打印功能替换它们,让我们称之为scribble()。因为如果我只是用涂鸦来搜索和替换打印(没有关闭的填充。我认为正则表达式是如何,但我已经试用了一天左右,我似乎无法让它工作。
答案 0 :(得分:7)
使用编辑器
我不知道你正在使用哪个编辑器,但如果它支持RegEx搜索和替换,你可以尝试这样的事情:
Replace: print "(.*?)"
With: scribble( "\1" )
我在Notepad ++中对此进行了测试。
使用Python
或者,您可以使用Python本身:
import re
f = open( "code.py", "r" )
newsrc = re.sub( "print \"(.*?)\"", "scribble( \"\\1\" )", f.read() )
f.close()
f = open( "newcode.py", "w" )
f.write( newsrc )
f.close()
答案 1 :(得分:3)
实际上,您可以使用included 2to3
tool将所有print
语句转换为print()
个函数。虽然此工具通常用于尽可能完整地将Python 2程序转换为Python 3程序,但它实际上是一组小修补程序,您可以选择要运行的修复程序。在您的情况下,您可以在调用print
时通过提供参数-f print
来仅运行2to3
修复程序。
答案 2 :(得分:1)
您可以重载打印功能,而不是替换它!
在python 2.x中,这不是直接可能的。但是有些工具可以将python 2.x转换为python 3代码。
通过转换器运行代码,然后重载打印功能。
2.6以下的python版本仍然支持使用 future 打印功能(从而重载)。因此,一旦转换,您的代码仍应适用于旧版本。虽然看起来大多数如果没有使用3.x正在使用2.7,所以你可能不需要未来
答案 3 :(得分:1)
答案 4 :(得分:0)
如果您还没有使用过,那么真正的IDE会帮助您。使用像PyCharm或Eclipse这样的IDE,您可以使用重构来用不同的调用替换对特定函数的所有调用。
答案 5 :(得分:0)
这是一个 Emacs 实现,默认情况下,它将打印语句转换为打印函数,并可选择将任何语句更改为任何函数。我已经尝试清楚地记录它,但如果有任何不清楚的地方,请告诉我。
OP 可以与 M-x my-statement-to-function RET scribble RET
交互使用,也可以与 (my-statement-to-function "print" "scribble")
以编程方式使用。
(defun my-statement-to-function (&optional statement func)
"Convert STATEMENT to FUNC.
For use with statements in Python such as 'print'. Converts
statements like,
print \"Hello, world!\"
to a function like,
print(\"Hello, world\")
Also works generally so that the STATEMENT can be changed to any
FUNC. For instance, a 'print' statement,
print \"Hello, world!\"
could be changed to a function,
banana(\"Hello, world!\")
Default STATEMENT is 'print'. Default FUNC is
STATEMENT (e.g. 'print'). Prompt for STATEMENT and FUNC when
called with universal prefix, `C-u'."
(interactive "p")
(let* ((arg statement) ; statement argument overwritten, so preserve value
;; only prompt on universal prefix; 1 means no universal, 4 means universal
(statement (cond ((eql arg 1) "print") ; no prefix
((eql arg 4) (read-string "Statement (print): " "" nil "print")))) ; C-u
(func (cond ((eql arg 1) statement) ; no prefix
((eql arg 4) (read-string (concat "Function " "(" statement "): ") "" nil statement)))) ; C-u
;; [[:space:]]* -- allow 0 or more spaces
;; \\(\"\\|\'\\) -- match single or double quotes
;; \\(\\) -- define capture group for statement expression; recalled with \\2
(regexp (concat statement "[[:space:]]*\\(\"\\|\'\\)\\(.*?\\)\\(\"\\|'\\)"))
;; replace statement with function and place statement expression within parentheses \(\)
(replace (concat func "\(\"\\2\"\)")))
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(replace-match replace))))