Pythonic实现安静/详细标志的功能

时间:2017-01-05 02:00:38

标签: python variables pep8

为了编写 pythonic 代码,我想知道是否有一个样式指南,涵盖了使用安静或冗长的函数选项。

例如,在我的Python包中,我有一系列相互调用的函数,因此用户最好能够有时请求打印输出。

例如:

Private _textExtractor As TextExtractor
Private _attachmentTextFilepath As String = "c:\temp\EmailAttachmentText.txt"
Private Shared Sub IterateMessages(folder As Outlook.Folder)
    Dim fi = folder.Items
    If fi IsNot Nothing Then
        For Each item As [Object] In fi
            Dim mi As Outlook.MailItem = DirectCast(item, Outlook.MailItem)
            Dim attachments = mi.Attachments
            If attachments.Count <> 0 Then
                For i As Integer = 1 To mi.Attachments.Count
                    'Save email attachments
                    mi.Attachments(i).SaveAsFile("C:\temp\" + mi.Attachments(i).FileName)

                    'Use TIKA to read the contents of the file
                    Dim textExtractionResult As TextExtractionResult = _textExtractor.Extract("C:\temp\" + mi.Attachments(i).FileName)

                    'Save attachment text to a txt file
                    File.AppendAllText(_attachmentTextFilepath, textExtractionResult.Text)
                Next
            End If
        Next
    End If
End Sub

这里是否有标准的arg名称。例如 应该使用“安静”/“静音”来抑制所有打印输出。 或者,如果为真,应该使用“详细”来要求这个吗?

2 个答案:

答案 0 :(得分:7)

基本上你可以使用logging module来设置所需的日志记录级别,记录器将保存/打印/导出(根据你的配置)记录的值。

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything

您可以使用以下方式设置记录器的级别:

logging.basicConfig(level=logging.INFO)

还有很多more options there

答案 1 :(得分:2)

如果您不想依赖日志库,我认为您的解决方案已经足够 pythonic 。写作可能有点pythonic:

def simple_addition(a, b, silent=True):
    res = a + b
    if not silent:
        print('The answer is %i' % res)
    return res

PEP 8, Other Recommendations所述,单行if语句可以,但不鼓励。

还有其他可能性。

使用or

使用or运算符对条件进行编码可能不是pythonic 但就个人而言,我觉得它很好看:“沉默或......”,“安静或......”。见下文:

def simple_addition(a, b, silent=True):
    res = a + b
    silent or print('The answer is %i' % res)
    return res

or运算符会发生短路,所以print及其参数仅在静默为False时评估,就像使用if语句时一样。

缺点是如果mypy绑定到布尔类型,silent类型检查将失败:

$ cat > add.py
def simple_addition(a, b, silent: bool = True):
    res = a + b
    silent or print('The answer is %i' % res)
    return res
^D
$ mypy add.py
add.py:3: error: "print" does not return a value

noop三元

我们也可以这样做:

def noop(*args, **kwargs):
    pass

def simple_addition(a, b, silent=True):
    _print = noop if silent else print
    res = a + b 
    _print('The answer is %i' % res)
    return res

......但感觉相当不熟悉。