python用函数替换打印

时间:2012-05-11 21:38:27

标签: python

我正在使用python 2.6并且在我的长程序中有一堆打印状态。如何用我的自定义打印功能替换它们,让我们称之为scribble()。因为如果我只是用涂鸦来搜索和替换打印(没有关闭的填充。我认为正则表达式是如何,但我已经试用了一天左右,我似乎无法让它工作。

6 个答案:

答案 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)

使用Pycharm

如果您使用的是pycharm,则可以通过以下模式使用Regex函数:

Replace: print\s(.*)
With: print($1)

enter image description here

答案 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))))