2013-01-18 6 views
5

私はprint文の代わりにそれに取り組んでいるpythonプロジェクトを持っています。私は開発中に情報を出力し、生産中に情報を記録することができます。しかし、私はしばしばこれを忘れて、誤ってコードにprintステートメントを入れます。とにかくPythonプログラムに独自のソースを読み込ませ、exit()が関数say()の外にあるprintステートメントを見つけたらそれはありますか?印刷の文章を防ぐための自己スキャンコード

+1

あなたは自分でそれをしないのはなぜテキストエディタ? – Blender

+1

ctrl fまたはctrl rをテキストエディタで使用しています.... –

+0

テキストエディタはコード実行時にコマンドを実行できません。 – captainandcoke

答えて

7

これはastモジュールを使用して行うことができます。

from __future__ import print_function 
print = None 

あなたsay()機能と一緒にこれを置く、あなたのような何かを行うことができます。次のコードは、の将来のPython 3またはPython 2を使用している場合のために、printステートメントとprint()関数の呼び出しを検出します。

import ast 

class PrintFinder(ast.NodeVisitor): 
    def __init__(self): 
     self.prints_found = [] 

    def visit_Print(self, node): 
     self.prints_found.append(node) 
     super(PrintFinder, self).generic_visit(node) 

    def visit_Call(self, node): 
     if getattr(node.func, 'id', None) == 'print': 
      self.prints_found.append(node) 
     super(PrintFinder, self).generic_visit(node) 


def find_print_statements(filename): 
    with open(filename, 'r') as f: 
     tree = ast.parse(f.read()) 
    parser = PrintFinder() 
    parser.visit(tree) 
    return parser.prints_found 

print 'hi' 
for node in find_print_statements(__file__): 
    print 'print statement on line %d' % node.lineno 

この例の出力は次のとおりです。ライン上の

ハイテク
print文ライン上の24
print文26

1

これはお勧めしませんが、実際には、printステートメントを再定義することでPythonインタプリタにエラーが発生する可能性があります。

のPython 3を使用している場合は、単にあなたのコードの先頭に/上部付近にこれを置く:

print = None 

任意のprint文がある場合は、あなたがTypeError: 'NoneType' object is not callableエラーが発生します。

Python 2.xを使用している場合は、別のanswerで提案されているアイデアを使用して、Python 2.xがオーバーライド可能なprint文を持つようにすることができます。

print_original = print 
print = None 

def say(data): 
    print = print_original 
    # Your current `say()` code here, such as: 
    print(data) # Could just use `print_original` instead. 
    # Redefine print to make the statement inaccessible outside this function. 
    print = None 
+0

'None'は呼び出すことができないので、新しい' print' "関数"が呼び出されたときに例外が発生します。 OPが望んでいるものではありません。特に、コードが実際に実行されたときにだけ壊れるからです。 – ThiefMaster

+1

OPは、印刷文が出たら、プログラムがexit()するようにします。例外をスローすると、プログラムが終了します。しかし、これは最初は非常に望ましいことではないと私は同意するが、それは私が推測する誰かのために働くことができる。 –

+1

私にとっては、彼がソース全体をチェックして、実行中に*いくつかの点でそれをしないと思うように思えます。 – ThiefMaster

関連する問題