Python装饰器;类型错误:';非类型';对象不可调用
我已经创建了一个装饰器,它充当到Sqlite数据库的连接。在尝试测试正在修饰的函数时,Python装饰器;类型错误:';非类型';对象不可调用,python,Python,我已经创建了一个装饰器,它充当到Sqlite数据库的连接。在尝试测试正在修饰的函数时,Event.create(),我得到以下错误:TypeError:“NoneType”对象不可调用。不确定导致此错误的原因。如果它与@classmethod装饰器有关,我不确定这是为什么?我没有太多的装饰经验,所以我想知道为什么 main.py import sqlite3 db = sqlite3.connect("main_db.db") def db_connect(func):
Event.create()
,我得到以下错误:TypeError:“NoneType”对象不可调用。不确定导致此错误的原因。如果它与@classmethod装饰器有关,我不确定这是为什么?我没有太多的装饰经验,所以我想知道为什么
main.py
import sqlite3
db = sqlite3.connect("main_db.db")
def db_connect(func):
global db
def wrapper_db_connect(*args, **kwargs):
try:
with db:
return func()
except sqlite3.IntegrityError:
pass
finally:
db.close()
class Event:
@db_connect
@classmethod
def create(cls, *args, **kwargs):
db.execute("""
INSERT INTO event VALUES(:name, :occurs: :desc)
""", kwargs)
@db_connect
@classmethod
def delete(cls, *args, **kwargs):
pass
import unittest
import sqlite3
from main import Event
class TableSetup(unittest.TestCase):
def setUp(self):
self.db = sqlite3.connect(":memory:")
with self.db:
self.db.execute("""
CREATE TABLE event (
name TEXT UNIQUE,
occurs TEXT,
description TEXT
)
""")
def tearDown(self):
print("DROP")
with self.db:
self.db.execute("DROP TABLE event")
class TestEventOrganizer(TableSetup):
def setUp(self):
super().setUp()
self.event_user_data = {
'name': 'Event A',
'occurs': '2020-3-1',
'desc': 'Event A'
}
def test_create_event(self):
Event.create(**self.event_user_data)
self.assertEqual(db.total_changes, 1)
self.assertEqual(str(self.stored_event), "Event A")
def tearDown(self):
super().tearDown()
测试.py
import sqlite3
db = sqlite3.connect("main_db.db")
def db_connect(func):
global db
def wrapper_db_connect(*args, **kwargs):
try:
with db:
return func()
except sqlite3.IntegrityError:
pass
finally:
db.close()
class Event:
@db_connect
@classmethod
def create(cls, *args, **kwargs):
db.execute("""
INSERT INTO event VALUES(:name, :occurs: :desc)
""", kwargs)
@db_connect
@classmethod
def delete(cls, *args, **kwargs):
pass
import unittest
import sqlite3
from main import Event
class TableSetup(unittest.TestCase):
def setUp(self):
self.db = sqlite3.connect(":memory:")
with self.db:
self.db.execute("""
CREATE TABLE event (
name TEXT UNIQUE,
occurs TEXT,
description TEXT
)
""")
def tearDown(self):
print("DROP")
with self.db:
self.db.execute("DROP TABLE event")
class TestEventOrganizer(TableSetup):
def setUp(self):
super().setUp()
self.event_user_data = {
'name': 'Event A',
'occurs': '2020-3-1',
'desc': 'Event A'
}
def test_create_event(self):
Event.create(**self.event_user_data)
self.assertEqual(db.total_changes, 1)
self.assertEqual(str(self.stored_event), "Event A")
def tearDown(self):
super().tearDown()
你的decorator没有返回
wrapper\u db\u connect
。我投票结束这个问题,因为它似乎只是一个输入错误。如果你仍然不明白,请将问题简化为一个简单的问题,以便更容易写出答案。