我有一个类,我想可以这样使用:
obj = MyClass(arg1, arg2)
if (obj is None):
# tell user to try again
else:
# give user options for continuing
创建对象的基本算法(在
__init__
和/或__new__
中,我不确定)应该如下:retrieve database record from arg1 and arg2 search criteria
if a record is returned
setup instance variables
else
return None
有没有一种绝对的蟒蛇式的方法来做这个?我读过几篇文章建议改为引发异常,但这似乎不对,因为这是预期的行为。我已经看到其他人建议使用
__new__
,但是我如何在__new__
中检查数据库以查看记录是否有效,而不必在__init__
中设置实例变量? 最佳答案
在这里提出一个例外是完全有效的。SQLAlchemy是一个比较流行的Python ORM,如果需要记录但找不到,它会引发一个NoResultFound
exception(尽管这是来自a function,而不是类实例化,因此可能无法直接比较)。我觉得这样做一点都不稀奇-it's not bad form to raise exceptions in __init__
!
你想表达的“一个值的缺失,而不是一个错误”的想法与Option type类似,但这并不是一个真正的Pythonic构造。如“Is there a Python equivalent for Scala's Option or Either?”中所述,Pythonic方法是抛出异常。
你不应该认为异常意味着你的程序被破坏了,只是在某种程度上破坏了预期的事件流。您可能想阅读“When and how should I use exceptions?”,它提供了一些关于Python中异常的常见哲学的想法。
作为commented by idjaw,它是Easier to Ask for Forgiveness than Permission:
这种常见的Python编码风格假定存在有效的密钥或属性,如果假设被证明是错误的,则捕获异常。这种干净利落的风格的特点是出现了许多try-and-except语句。这种技术与许多其他语言(如C语言)所共有的LBYL风格形成了对比。
你应该假设记录存在,如果没有,则处理错误。Python是围绕这个设计的,如果你遵循EAFP,你会发现代码最终会变得更干净。
关于python - 这个算法的pythonic方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42890590/