在调用一个可能定义或未定义的对象上进行练习。

8 浏览
0 Comments

在调用一个可能定义或未定义的对象上进行练习。

以下的写法是否被认为是不好的实践:

var = var if 'var' in globals() else None    

换句话说,如果有一个if语句定义了一个变量,并且我可能需要在后面访问该变量,是否可以使用上述的这种写法,而不是在if语句之前定义变量为None

为什么上述的写法可以接受或者为什么不能接受?

一个例子如下:

if process == 'yes':
    # 100行代码
    obj = {...}
return Response(obj)

0
0 Comments

在上述内容中,出现了一种代码编写实践,即调用可能已定义或未定义的对象。这种实践是不好的,因为它混淆了作用域,使代码变得混乱。通过检查变量var是否在全局作用域中定义,然后从当前的作用域中获取它的值,无论当前作用域是全局还是其他。这种实践会导致以下结果:

def func():
    var = 'Local'
    var = var if 'var' in globals() else None
    print(var)
func()  # 输出 None
var = 'Global'
func()  # 输出 Local

如果你想始终在全局作用域中查找var,可以使用dict.get方法,并设置一个默认值:

var = globals().get('var', None)

如果你想始终在当前作用域中查找var,可以使用try-except语句捕获NameError,就像Reblochon Masque答案中所示:

try:
    var = var
except NameError:
    var = None

通过使用这些解决方法,可以避免调用可能已定义或未定义的对象的问题,提高代码的可读性和可维护性。

0
0 Comments

在上述代码中,出现了一个问题,即调用一个可能已定义或未定义的对象。这种做法是不好的实践,因为它会导致代码的可读性和可维护性下降。

为了解决这个问题,我们可以使用以下方法之一:

1. 使用globals()函数:

if 'obj' not in globals():
    obj = None
if process == 'yes':
    # 100 lines of code
    obj = {...}
# maybe log a warning in case obj is None still or handle it in the caller
return Response(obj)

这种方法通过检查全局变量来确定对象是否已定义。如果对象未定义,则将其设置为None,并在需要时进行赋值。这样可以确保代码的可读性,但使用全局变量可能会导致其他问题,因此需要谨慎使用。

2. 使用try-except语句:

try:
    obj
except NameError:
    obj = None
if process == 'yes':
    # 100 lines of code
    obj = {...}
# maybe log a warning in case obj is None still or handle it in the caller
return Response(obj)

这种方法使用try-except语句来捕获可能的NameError异常,如果发生异常,则将对象设置为None。这种方法比较简洁,但使用异常处理可能会带来一些性能损失,因此需要权衡利弊。

无论选择哪种方法,都应该避免在代码中调用可能已定义或未定义的对象。最好的做法是在使用之前始终明确定义所有的变量,以提高代码的可读性和可维护性。在上述代码示例中,我们可以通过在if语句之前定义obj变量来避免这个问题。

调用可能已定义或未定义的对象是一种不好的实践,会导致代码的可读性和可维护性下降。我们可以使用globals()函数或try-except语句来解决这个问题,但最好的做法是在使用之前始终明确定义所有的变量。

0