2013-09-26 74 views
0

我有一个模块一个方法:如何抑制输出输入模块

def find_inverse_matrix(C, log=False): 

    n = C.shape[0] 

    Cs = C.copy() 
    i = 0 
    C = np.matrix(np.eye(n)) 
    B = np.matrix(np.eye(n)) 
    J = set(range(n)) 
    S = [0] * n 

    if log: print Cs 

    while i <= n-1: 
     if log: print '\nIteration', i 
     f = False 
     j = 0 
     ei = get_ek(i, n) 

     for j in J: 
      cj = get_ck(Cs, j) 
      alpha = (ei * B * cj)[0, 0] 
      if log: print 'alpha%s = %s' % (j, alpha) 
      if not(is_zero(alpha)): 
       f = True 
       break 

     if not(f): 
      exit('Inverse matrix is not exist') 

     J.remove(j) 
     S[j] = i 
     C[:, i] = Cs[:, j] 
     if log: print 'C%s:\n%s' % (i, C) 
     D = get_Dkz(i, B * C[:, i]) 
     if log: print 'D%s:\n%s' % (i, D) 
     B = D * B 
     if log: print 'B%s:\n%s' % (i, B) 

     i += 1 
    if log: print '\n S = ', S 

    if log: print 'Result' 
    R = construct_matrix(B, S) 
    if log: print R 

    if log: print '\nCheck result:' 
    if log: print Cs * R 
    return R 

如果我把这个方法从这个文件将会显示所有的打印,但如果我从另一个电话如果所有打印应该被抑制。现在,我在每次印刷之前使用检查,但是它如何在'pythonic'风格中简单又美观?

+1

[Python»文档»Python HOWTOs»Logging HOWTO](http://docs.python.org/2/howto/logging.html) –

+0

感谢您的支持。我知道日志模块,但目前模块已经用'print'语句编写。 –

回答

2

通常情况下,print是该语言的声明。但是,如果您将行from __future__ import print_function添加到您的导入,那么它将用作函数。这意味着两件事:

a)您需要使用此功能 - 意为print(Cs)而不是print Cs

b)你可以覆盖它,因为在python函数中是可以玩的对象。

您可以定义您自己的“my_print”功能,您可以稍后更改而不是内置print

例子:

>>> from __future__ import print_function 
>>> _print_ = print 
>>> def myprint(*arg, **kwarg): 
...  _print_("yeah.") 
...  _print_(*arg,** kwarg) 
... 
>>> myprint("ok") 
yeah. 
ok 
>>> print = myprint 
>>> print('3') 
yeah. 
3 
>>> 

所以只写你myprint功能,使得它会检查之前,“日志”,并打印件应该是一样的。或者仅在您不想打印时才覆盖print

+0

在这种情况下,我只需要修改导入的模块,对吧?请参阅示例https://dpaste.de/HPHdw/ –

+0

输出位于底部?然后它给了你想要的结果,对吧? –

+0

是的,它在这里。好吧。 –

1

if __name__ == '__main__':只会在文件直接执行时才执行代码块,而不是作为模块加载。你可以在那里设置一个标志来打开日志。

更为pythonic的方式可能是将日志功能传递到模块而不是标志。这样你可以传入一个空的函数来抑制日志记录。