我是Python和PyCharm的新手,所以请原谅我的无知。
我试图在初始化类时了解函数的执行——特别是,如果传递到新实例中,我想重用数据库连接对象,但如果没有,我想创建一个。我有一个创建连接的函数get_cnx()
。我发现,无论是在__init__
语句中使用默认参数来调用get_cnx()
:
def __init__(self, db_cnx=get_cnx())
或者是否使用关键字参数:
self.db_cnx = kwargs.get('db_cnx', get_cnx())
无论传入的连接参数的存在(或内容(如何,函数都会执行。这使重新使用连接的对象失败,所以我恢复到if
条件。我相信有一种方法可以通过装饰师来做到这一点,但那感觉就像给莉莉镀金。
无论如何,这就是我实际问题的背景:为了帮助我弄清楚发生了什么,我创建了这个简单的测试,作为一个名为"classes.py"的模块:
greeting = 'Good Day'
def my_func():
global greeting
greeting = 'Changed'
return 'Hello'
class Animal:
def __init__(self, greet):
if not greet:
self.greet = my_func()
else:
self.greet = greet
if __name__ == '__main__':
cat = Animal(None)
如果我运行这个模块(在配置中选中了"run with Python console"(,我会看到全局变量greeting
以蓝色显示为"Changed",这正是我所期望的。
如果我将最后一位更改为:
if __name__ == '__main__':
cat = Animal('Wotcha')
我看到蓝色显示的全局变量是"Good Day",这也是我所期望的。
然而,当我在控制台中键入以下内容时:
dog = Animal(None)
全局变量名称变为红色,但仍显示"Good Day"。
同样,使用PyCharm控制台也可以做同样的事情:
>>> print(greeting)
Good Day
>>> dog = Animal(None)
>>> print(greeting)
Good Day
现在,我将模块加载到IDLE中,并点击F5(运行模块(,然后在控制台中执行以下操作:
>>> greeting
'Good Day'
>>> dog = Animal(None)
>>> greeting
'Changed'
这是我期望在PyCharm控制台中看到的。
有人能解释一下发生了什么吗?这可能是一个bug,还是我对PyCharm处理范围的方式缺乏理解?还是我对执行范围缺乏更广泛的理解?
谢谢!!
JetBrains为我打开了一份错误报告,确认行为与预期不符。