128 votes

Comment bloquer les appels à imprimer ?

Existe-t-il un moyen d'empêcher une fonction d'appeler print ?


J'utilise le pygame.joystick pour un jeu sur lequel je travaille.

J'ai créé un pygame.joystick.Joystick et, dans la boucle du jeu, appeler sa fonction membre get_button pour vérifier la saisie de l'utilisateur. La fonction fait tout ce dont j'ai besoin, mais le problème est qu'elle appelle également print ce qui ralentit considérablement le jeu.

Puis-je bloc cet appel à print ?

1voto

user17527081 Points 1
"stop a function from calling print"
# import builtins
# import __builtin__ # python2, not test
printenabled = False
def decorator(func):
    def new_func(*args,**kwargs):
        if printenabled:
            func("print:",*args,**kwargs)
    return new_func
print = decorator(print) # current file
# builtins.print = decorator(builtins.print)  # all files
# __builtin__.print = decorator(__builtin__.print) # python2

import sys
import xxxxx
def main():
    global printenabled
    printenabled = True
    print("1 True");
    printenabled = False
    print("2 False");
    printenabled = True
    print("3 True");
    printenabled = False
    print("4 False");
if __name__ == '__main__':
    sys.exit(main())

#output
print: 1 True
print: 3 True

https://stackoverflow.com/a/27622201

1voto

Modification de la valeur de l'objet fichier de la fonction print(). Par défaut, c'est sys.stdout Au lieu de cela, nous pouvons écrire sur un dispositif nul par open(os.devnull, 'w')

import os, sys

mode = 'debug' #'prod'

if mode == 'debug':
    fileobj = sys.stdout
else:
    fileobj = open(os.devnull,'w')

print('Hello Stackoverflow', file = fileobj)

0voto

Quan Hoang Points 53

Basé sur la solution de @Alexander Chzhen, je présente ici la façon de l'appliquer sur une fonction avec une option pour supprimer l'impression ou non.

    import os, sys
    class SuppressPrints:
        #different from Alexander`s answer
        def __init__(self, suppress=True):
            self.suppress = suppress

        def __enter__(self):
            if self.suppress:
                self._original_stdout = sys.stdout
                sys.stdout = open(os.devnull, 'w')

        def __exit__(self, exc_type, exc_val, exc_tb):
            if self.suppress:
                sys.stdout.close()
                sys.stdout = self._original_stdout
    #implementation
    def foo(suppress=True):
        with SuppressPrints(suppress):
            print("It will be printed, or not")

    foo(True)  #it will not be printed
    foo(False) #it will be printed

J`espère pouvoir ajouter ma solution sous la réponse d`Alexandre en tant que commentaire, mais je n`ai pas assez de (50) réputations pour le faire.

0voto

jcbordon96 Points 1

Si vous voulez activer/désactiver l'impression avec une variable, vous pouvez appeler une fonction auxiliaire à la place de print, quelque chose comme printe(le nom est juste pour la commodité)

def printe(*what_to_print):
if prints_enable:
    string = ""
    for items in what_to_print:
        string += str(items) + " "
    print(string)

-1voto

user2800464 Points 87

Définissez une nouvelle fonction d'impression dans laquelle vous activez d'abord l'impression, puis l'impression de la sortie. Puis vous désactivez à nouveau l'impression.

def Print (*output):
   enablePrint()
   print (output)
   disablePrint()

avec l'une des paires de fonctions d'activation/désactivation "sûres" ci-dessus

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X