第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使Python中的函數(shù)標準輸出靜音,而不會破壞sys.stdout并恢復(fù)每個函數(shù)調(diào)用

使Python中的函數(shù)標準輸出靜音,而不會破壞sys.stdout并恢復(fù)每個函數(shù)調(diào)用

犯罪嫌疑人X 2019-12-13 15:10:59
Python中是否有一種方法可以在不包裝如下所示的函數(shù)調(diào)用的情況下使stdout靜音?原始破解代碼:from sys import stdoutfrom copy import copysave_stdout = copy(stdout)stdout = open('trash','w')foo()stdout = save_stdout編輯:更正了來自Alex Martelli的代碼import syssave_stdout = sys.stdoutsys.stdout = open('trash', 'w')foo()sys.stdout = save_stdout這種方法可行,但效率極低。有有是一個更好的辦法。有任何想法嗎?
查看完整描述

3 回答

?
慕后森

TA貢獻1802條經(jīng)驗 獲得超5個贊

只是為了補充別人已經(jīng)說過的內(nèi)容,Python 3.4引入了contextlib.redirect_stdout上下文管理器。它接受將輸出重定向到的文件(類)對象。


重定向到/ dev / null將抑制輸出:


In [11]: def f(): print('noise')


In [12]: import os, contextlib


In [13]: with open(os.devnull, 'w') as devnull:

   ....:     with contextlib.redirect_stdout(devnull):

   ....:         f()

   ....:         


In [14]: 

此解決方案可以用作裝飾器:


import os, contextlib


def supress_stdout(func):

    def wrapper(*a, **ka):

        with open(os.devnull, 'w') as devnull:

            with contextlib.redirect_stdout(devnull):

                func(*a, **ka)

    return wrapper


@supress_stdout

def f():

    print('noise')


f() # nothing is printed



在Python 2和3中都可以使用的另一種可能且偶爾有用的解決方案是將/ dev / null作為參數(shù)傳遞給f并使用函數(shù)的file參數(shù)重定向輸出print:


In [14]: def f(target): print('noise', file=target)


In [15]: with open(os.devnull, 'w') as devnull:

   ....:     f(target=devnull)

   ....:     


In [16]: 

您甚至可以target完全選擇:


def f(target=sys.stdout):

    # Here goes the function definition

請注意,您需要


from __future__ import print_function

在Python 2中



查看完整回答
反對 回復(fù) 2019-12-14
?
largeQ

TA貢獻2039條經(jīng)驗 獲得超8個贊

您為什么認為這效率低下?你測試了嗎?順便說一句,它根本不起作用,因為您正在使用該from ... import語句。sys.stdout可以很好地進行替換,但是不要進行復(fù)制,也不要使用臨時文件。而是打開空設(shè)備:


import sys

import os


def foo():

    print "abc"


old_stdout = sys.stdout

sys.stdout = open(os.devnull, "w")

try:

    foo()

finally:

    sys.stdout.close()

    sys.stdout = old_stdout



查看完整回答
反對 回復(fù) 2019-12-14
?
慕哥9229398

TA貢獻1877條經(jīng)驗 獲得超6個贊

stdout假設(shè)foo包含print語句,在執(zhí)行操作時分配變量不會產(chǎn)生任何影響-另一個示例,說明為什么您永遠不應(yīng)該從模塊內(nèi)部導(dǎo)入內(nèi)容(如此處所做的操作),而始終從模塊內(nèi)部整體導(dǎo)入(然后使用限定名稱)。copy順便說一句,這無關(guān)緊要。您的摘要的正確等效項是:


import sys

save_stdout = sys.stdout

sys.stdout = open('trash', 'w')

foo()

sys.stdout = save_stdout

現(xiàn)在,當(dāng)代碼正確時,是使它更優(yōu)雅或更快速的時候了。例如,您可以使用內(nèi)存中類似文件的對象代替文件“ trash”:


import sys

import io

save_stdout = sys.stdout

sys.stdout = io.BytesIO()

foo()

sys.stdout = save_stdout

為了優(yōu)雅起見,上下文是最佳的,例如:


import contextlib

import io

import sys


@contextlib.contextmanager

def nostdout():

    save_stdout = sys.stdout

    sys.stdout = io.BytesIO()

    yield

    sys.stdout = save_stdout

一旦定義了此上下文,對于不需要標準輸出的任何塊,


with nostdout():

    foo()

更多優(yōu)化:您只需要使用具有no-op write方法的對象替換sys.stdout 。例如:


import contextlib

import sys


class DummyFile(object):

    def write(self, x): pass


@contextlib.contextmanager

def nostdout():

    save_stdout = sys.stdout

    sys.stdout = DummyFile()

    yield

    sys.stdout = save_stdout

與之前的實現(xiàn)方式相同nostdout。我認為它不會比這更干凈或更快速;-)。



查看完整回答
反對 回復(fù) 2019-12-14
  • 3 回答
  • 0 關(guān)注
  • 329 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號