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”风格简单而漂亮的呢?

4

2 回答 2

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或者仅在您不想禁止打印时才覆盖。

于 2013-09-26T08:23:43.797 回答
1

if __name__ == '__main__':仅当直接执行文件而不是作为模块加载时才会执行代码块。您可以在此处设置一个标志以打开日志记录。

一种更 Pythonic 的方法可能是将日志函数而不是标志传递到模块中。这样你就可以传入一个空函数来禁止记录。

于 2013-09-26T08:26:17.657 回答