相关疑难解决方法(0)

hasattr()vs try-except块来处理不存在的属性

if hasattr(obj, 'attribute'):
    # do somthing
Run Code Online (Sandbox Code Playgroud)

VS

try:
    # access obj.attribute
except AttributeError, e:
    # deal with AttributeError
Run Code Online (Sandbox Code Playgroud)

哪个应该是首选,为什么?

python attributes exception-handling exception hasattr

80
推荐指数
7
解决办法
3万
查看次数

LBYL与Java中的EAFP?

我最近在教自己Python并在代码执行之前发现了关于错误检查的LBYL/EAFP习语.在Python中,似乎接受的样式是EAFP,它似乎与该语言一起使用.

LBYL(大号 OOK 安伏ý OU 大号 EAP):

def safe_divide_1(x, y):
    if y == 0:
        print "Divide-by-0 attempt detected"
        return None
    else:
        return x/y
Run Code Online (Sandbox Code Playgroud)

EAFP(它的ê asier到一个 SK ˚F orgiveness比P ermission):

def safe_divide_2(x, y):
    try:
        return x/y
    except ZeroDivisionError:  
        print "Divide-by-0 attempt detected"
        return None
Run Code Online (Sandbox Code Playgroud)

我的问题是:我从来没有听说过使用EAFP作为主要数据验证结构,来自Java和C++背景.EAFP在Java中使用是否明智?或者是否存在过多的异常开销?我知道实际抛出异常时只有开销,所以我不确定为什么不使用更简单的EAFP方法.这只是偏好吗?

python java error-handling idioms

59
推荐指数
5
解决办法
2万
查看次数

检查Python中的成员是否存在

我经常想检查对象是否有成员.一个例子是在函数中创建单例.为此,您可以这样使用hasattr:

class Foo(object):
    @classmethod
    def singleton(self):
        if not hasattr(self, 'instance'):
            self.instance = Foo()
        return self.instance
Run Code Online (Sandbox Code Playgroud)

但你也可以这样做:

class Foo(object):
    @classmethod
    def singleton(self):
        try:
            return self.instance
        except AttributeError:
            self.instance = Foo()
            return self.instance
Run Code Online (Sandbox Code Playgroud)

另一种方法更好吗?

编辑:添加了@classmethod...但请注意,问题不是关于如何制作单例,而是如何检查对象中是否存在成员.

编辑:对于该示例,典型用法是:

s = Foo.singleton()
Run Code Online (Sandbox Code Playgroud)

然后s是类型的对象,Foo每次都相同.并且,通常,该方法被多次调用.

python exception introspection hasattr

26
推荐指数
3
解决办法
1万
查看次数