Ich habe einmal einen Artikel in meinem Blog mit dem Titel FizzBuzz mit Fehlern schreiben veröffentlicht, nachdem ich Ruby geübt hatte. Es gab jedoch eine überraschende Reaktion und die folgende Geschichte wurde in Qiita geschrieben:
Ich komme ursprünglich aus Python, also habe ich den Code schnell geschrieben im Geiste von "Übrigens, ich habe Python schon lange nicht mehr geschrieben, meine Fähigkeiten werden langweilig sein, und ich bin die Person, die im Originalartikel geschrieben hat, also MOTTAINAI !!" Sah.
Da das Muster jedoch bereits in mir festgelegt wurde, dauerte es ungefähr 20 Minuten. Daher ist es möglicherweise eine gute Idee, dies zu versuchen (wenn Sie sich in Python sicher sind).
class FizzBuzzError(Exception):
def __init__(self, message, errors):
self.message = message
self.errors = errors
def fizzbuzz_function(n, message):
def _return_fizz(i):
try:
1 / (i % n)
return ''
except ZeroDivisionError:
raise FizzBuzzError(message, message)
return _return_fizz
def error_message(f, *args, **kargs):
def _f(n):
try:
return f(n)
except FizzBuzzError as e:
return e.message
return _f
@error_message
def fizz(n):
return fizzbuzz_function(3, "Fizz")(n)
@error_message
def buzz(n):
return fizzbuzz_function(5, "Buzz")(n)
def fizzbuzz(n):
return "".join([fizz(n), buzz(n)]) or n
def main():
for i in [fizzbuzz(n + 1) for n in range(99)]:
print(i)
if __name__ == "__main__":
main()
Dies ist eine Python3-Spezifikation. Wenn Sie Python2 verwenden, verwenden Sie bitte import __future__ from print_function``;)
Ich kann nichts sagen, weil ich nicht tief verfolgt habe, weil ich ein wenig von Python entfernt bin, aber ich frage mich, ob eine solche Implementierung in Ordnung ist. Zur Zeit verwende ich diesen StackOverflow, ohne es zu verstehen, also vielleicht Diese Implementierung kann redundant sein.
class FizzBuzzError(Exception):
def __init__(self, message, errors):
self.message = message
self.errors = errors
Was Python ein bisschen besser macht als Ruby, ist die Leichtigkeit, Verschlüsse zu schreiben? Ich denke ehrlich, dass es mühsam ist, Proc und Hoge in Ruby zu erstellen, und wenn Sie in Python kein ()
hinzufügen, gefällt mir persönlich die Spezifikation der Handhabung von Funktionsobjekten (Masakari von Rubyist willkommen ……!).
Übrigens wird fizzbuzz zu ** abstrahiert, wenn es ein Vielfaches von etwas ist, wird eine entsprechende Nachricht ausgegeben **. Wenn Sie nur diesen Teil herausnehmen und erstellen, ist es praktisch, einen Verschluss in Python zu verwenden. Als tatsächliches Verwendungsbeispiel sieht es wie folgt aus.
def fizzbuzz_function(n, message):
def _return_fizz(i):
try:
1 / (i % n)
return ''
except ZeroDivisionError:
raise FizzBuzzError(message, message)
return _return_fizz
def fizz(n):
return fizzbuzz_function(3, "Fizz")(n)
Lassen Sie uns jetzt weiter überlegen. Wir wollen eine Hyper-Return von Error, wir wollen keinen Fehler.
Wenn Sie den Verschluss verstehen können, sollten Sie versuchen, einen Dekorateur zu verwenden. Für die Definition des Dekorateurs ist die folgende Erklärung von PEP 318 am einfachsten zu verstehen, daher zitiere ich sie:
@dec2
@dec1
def func(arg1, arg2, ...):
pass
This is equivalent to:
def func(arg1, arg2, ...):
pass
func = dec2(dec1(func))
Hier in diesem Code:
def error_message(f, *args, **kargs):
def _f(n):
try:
return f(n)
except FizzBuzzError as e:
return e.message
return _f
Dies ist ein kontroverser Punkt, aber "" "ist in der Python-Spezifikation falsch. Mit anderen Worten, wenn die Verknüpfung der beiden Ergebnisse eine leere Zeichenfolge ist, ist sie bereits falsch. Sie müssen also nur die empfangene Nummer so zurückgeben, wie sie ist. Es scheint praktisch, weil es nur mit dem sogenannten "oder Operator" geschrieben werden kann! Ich brauche keinen ternären Operator!
def fizzbuzz(n):
return "".join([fizz(n), buzz(n)]) or n
Also schrieb ich diesmal über den Fehler FizzBuzz von Python basierend auf der unerwarteten Reaktion.
Da der Originalartikel jedoch als Super-Return verwendet wird, ist es meiner Meinung nach am wahrscheinlichsten, dass "Raise" in diesem Fall nicht anders ist als "Return". Als ich versuchte, die Python-Fähigkeit von "Dekorateur" und seiner Umgebung zu betonen, kam ich zu dem obigen Code.
Was ist, wenn die Sprache keine Fehlerbehandlung hat?
Ich erinnere mich zum Beispiel, dass Go keine Syntax für die Fehlerbehandlung hat (ich wusste, dass "Panik" und "Wiederherstellung" vorbereitet wurden ...), aber im Fall von Haskell. Es gibt Zeiten, in denen du etwas sehen willst;)
Recommended Posts