什么';这个算法的pythonic方法是什么?

什么';这个算法的pythonic方法是什么?,python,object,instantiation,Python,Object,Instantiation,我有一个类,我希望能够像这样使用: obj = MyClass(arg1, arg2) if (obj is None): # tell user to try again else: # give user options for continuing retrieve database record from arg1 and arg2 search criteria if a record is returned setup instance variables

我有一个类,我希望能够像这样使用:

obj = MyClass(arg1, arg2)
if (obj is None):
    # tell user to try again
else:
    # give user options for continuing
retrieve database record from arg1 and arg2 search criteria
if a record is returned
    setup instance variables
else
    return None
对象创建的基本算法(在
\uuuuu init\uuuu
和/或
\uuuu new\uuuu
中,我不确定)应该是这样的:

obj = MyClass(arg1, arg2)
if (obj is None):
    # tell user to try again
else:
    # give user options for continuing
retrieve database record from arg1 and arg2 search criteria
if a record is returned
    setup instance variables
else
    return None
有没有一种绝对的蟒蛇式的方法?我读过几篇文章,建议改为引发异常,但这似乎不正确,因为这是预期行为。我已经看到其他人建议使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但如何在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中检查数据库以。执行
MyClass(无论什么)
就是实例化一个对象;根据定义,这将始终创建一个实例

另一种方法是将工厂函数定义为classmethod,它可以返回对象,也可以不返回对象

class MyClass(object):
    ...

    @classmethod
    def create_maybe(cls, arg1, arg2):
        ... do logic ...
        if whatever:
            return cls(arg1, arg2)

现在,要创建您的对象,您可以调用
MyClass.create_maybe(arg1,arg2)
我认为最好的方法是在您的类上创建一个工厂,如果该类无法检索正确的数据库记录,则允许该类引发异常,即:

class MyClass:
    def __init__(self, arg1, arg2):
        if arg1 or arg2:
            raise Exception()


def my_class(arg1, arg2):
    try:
        return MyClass(arg1, arg2)
    except Exception:  # using the default exception for simplicity
        return None


obj = my_class(arg1, arg2)
if obj is None:
    pass  # try again
else:
    pass  # other options

请不要在上述代码中使用默认的
异常
类,而是为您的特定模块类创建一个异常或使用一个内置异常。

在此处引发异常完全有效。SQLAlchemy是一种比较流行的Python ORM,如果需要记录但找不到记录(虽然这是源代码,但不是类实例化,因此可能无法直接比较),它会引发错误。我认为这样做一点也不奇怪-

您想要表达的“缺少值,但不是错误”的思想类似于,但这实际上不是一个python构造。如“”中所述,python方法是抛出异常

你不应该认为异常意味着你的程序被破坏了,只是在某种程度上对预期的事件流造成了中断。您可能想阅读“”一文,它提供了一些有关Python中异常的常见原理的想法

正如,它是:

这种常见的Python编码风格假设存在有效的键或属性,如果假设为false,则捕获异常。这种简洁快速的风格的特点是有许多尝试和例外的陈述。这种技术与许多其他语言(如C语言)所共有的LBYL风格形成对比

您应该假设记录存在,如果不存在,则处理错误。Python就是围绕这一点设计的,如果您遵循EAFP,您会发现代码最终会变得更干净。

是一种非常可接受的Python方法。