DÜZENLEME gibi diyoruz: orijinal soru tüm ayrıştırma işlemi dev birinde for
olduğunu ima gibiydi - döngü; cevabım aşağıdaki yorumları yansıtacak şekilde değiştirildi. Bunun yerine yazma birden for
-loops ait
, her biri içinde döngüler ne yapılması gerektiğini açıklayan işlevler yazmak ve her birini ile saracak onlara uygulamak için bir dekoratör yazmak, try
/catch
blok içermelidir for
-loop vetry
/catch
günlüğe kaydetme mantığı. Bu biraz glglgl'ın çözümü gibi, biraz daha Pythonic (bence). Örneğin:
def apply_to_nodes_and_log_errs(node_visit_func):
def safe_iterating_visitor(nodes_to_parse):
for node in nodes_to_parse:
try:
node_visit_func(node)
except StandardError as e:
LogErrorMessage ('blah blah blah {} in node {}'.fmt(e, node))
return safe_iterating_visitor
@apply_to_nodes_and_log_errs
def action_one(node):
# ... "lots of stuff" :D
@apply_to_nodes_and_log_errs
def action_two(node):
# different stuff
Bunun yerine parçalar halinde dekoratör kırmak istiyorsanız:
def iterate_over_nodelist(node_visit_func):
def iterating_visitor(nodes_to_parse):
for node in nodes_to_parse:
node_visit_func(node)
return iterating_visitor
def safely_visit_log_errs(node_visit_func):
def safe_logging_visitor(node_to_visit):
try:
node_visit_func(node)
except StandardError as e:
LogErrorMessage ('blah blah blah {} in node {}'.fmt(e, node))
return safe_logging_visitor
def apply_to_nodes_and_log_errs(node_visit_func):
return iterate_over_nodelist(safely_visit_log_errs(node_visit_func))
# ... write visit functions
Bu da functools.wraps
kullanılarak geliştirilebilir.
Standartınızın "mümkün olduğunca az sayıda girinti kullanması" durumunda, bu biraz çirkin görünebilir, ancak aslında bu oldukça Pythonic; dekoratörler yazarken oldukça az sayıda girinti seviyesinden kaçınmanın hiçbir yolu yoktur.
Son olarak, Exception
ile StandardError
arasında değişiklik yaptığımı unutmayın;
Bu bana iyi görünüyor, sorun nedir? – jonrsharpe
Bu çok güzel .. Dönmeyi denemek için daha seksi buluyorum. – Maroun
Yuvalama seviyesi sizi rahatsız ediyorsa, bu, öğeleri kendi işlevine taşımanın zamanıdır. –