En passant 'None' comme paramètre de la fonction (d'où le paramètre est une fonction)

Je suis en train d'écrire une petite application qui doit effectuer des 'hygiénique' avant d'entrer dans l'exécution. (eg. d'un sanity check: vérifier si un chemin est accessible en lecture /écriture /existe)

Le code:

import logging
import os
import shutil
import sys
from paths import PATH

logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger('sf.core.sanity')

def sanity_access(path, mode):
    ret = os.access(path, mode)
    logfunc = log.debug if ret else log.warning
    loginfo = (os.access.__name__, path, mode, ret)
    logfunc('%s(\'%s\', %s)==%s' % loginfo)
    return ret

def sanity_check(bool_func, true_func, false_func):
    ret = bool_func()
    (logfunc, execfunc) = (log.debug, true_func) if ret else \
        (log.warning, false_func)
    logfunc('exec: %s', execfunc.__name__)
    execfunc()

def sanity_checks():
    sanity_check(lambda: sanity_access(PATH['userhome'], os.F_OK), \
                 lambda: None, sys.exit)

Ma question est liée à la sanity_check fonction.

Cette fonction prend 3 paramètres (bool_func, true_func, false_func). Si le bool_func (qui est la fonction de test, renvoyant une valeur booléenne) échoue, true_func est exécuté, sinon le false_func est exécuté.

1) lambda: None est un peu boiteux , parce que par exemple si le sanity_access renvoie True, lambda: None est exécuté, et la sortie imprimée sera:

DEBUG:sf.core.sanity:access('/home/nomemory', 0)==True
DEBUG:sf.core.sanity:exec: <lambda>

Afin de ne pas être très clair dans les logs de la fonction qui ont été exécutés. Le journal ne contient <lambda> . Est-il un défaut de fonction qui ne fait rien et peut être passé en paramètre ? Est-ce une façon de retourner le nom de la première fonction qui est exécutée à l'intérieur d'un lambda ?

Ou une manière de ne pas journal "exec" si "rien" est envoyé comme un paramètre ?

Quelle est la aucun /ne-rien d'équivalent pour les fonctions ?

sanity_check(lambda: sanity_access(PATH['userhome'], os.F_OK), \
                 <do nothing, but show something more useful than <lambda>>, sys.exit)

Autre question, pourquoi est - lambda: pass au lieu de lambda: None pas de travail ?

Wow c'est complexe. Pourquoi est-elle si complexe?
Le "lambda chose" n'aide pas, est-il? Beaucoup de contrôles de ne pas justifier de son niveau de complexité. Pourquoi ne pas simplement utiliser if déclarations?
Vous pourriez tout simplement essayer d'écrire le chemin d'accès et le journal, si cela échoue.
Vous essayez d'écrire lisp, python.
La programmation fonctionnelle n' pas moyen d'écrire un tas de fonctions ou de passer des fonctions de autour de! Cela signifie écrire simple, évidemment correct et réutilisables, les fonctions et les utiliser pour mettre ensemble des fonctions plus complexes. FP fonctionne très bien en Python, mais son moins sur le passage de fonctions autour de et plus sur l'utilisation de LCs, des générateurs et des itertools.

OriginalL'auteur Andrei Ciobanu | 2010-09-16