次のコードがあります。
def evAnd(v, *predicates):
satisfied=True
for f in predicates:
if not f(v):
satisfied=False
# log: f,v->False in a map and other side effects
else:
# log: f,v->True in a map and other side effects
return satisfied
def evOr(v, *predicates):
satisfied=False
for f in predicates:
if f(v):
satisfied=True
# log: f,v->True in a map and other side effects
else:
# log: f,v->False in a map and other side effects
return satisfied
上記を単一の関数に統合する Pythonic の方法は何ですか? (ログメッセージが配置される場所にはかなりの副作用コードがあるため)
受け入れられた回答に基づく解決策
したがって、受け入れられた回答に基づいて、最終的に私が行ったことは次のとおりです。
def adorn(predicate):
def rv(v):
rvi = predicate(v)
if rvi:
print "%s is satisfied for value %d" % (predicate.__name__, v)
# any other side effects
else:
print "%s is not satisfied for value %d" % (predicate.__name__, v)
# any other side effects
return rvi
return rv
def my_all(n, predicates):
return reduce(operator.and_, map( lambda x : x(n), map(adorn, predicates)), True)
def my_any(n, predicates):
return reduce(operator.or_, map( lambda x : x(n) , map(adorn, predicates)), False)
次の方法でテストできます。
def even(n):
return n%2==0
def odd(n):
return n%2!=0
print my_all(3, [even, odd])
print my_any(4, [even, odd])