Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python装饰器;类型错误:';非类型';对象不可调用_Python - Fatal编程技术网

Python装饰器;类型错误:';非类型';对象不可调用

Python装饰器;类型错误:';非类型';对象不可调用,python,Python,我已经创建了一个装饰器,它充当到Sqlite数据库的连接。在尝试测试正在修饰的函数时,Event.create(),我得到以下错误:TypeError:“NoneType”对象不可调用。不确定导致此错误的原因。如果它与@classmethod装饰器有关,我不确定这是为什么?我没有太多的装饰经验,所以我想知道为什么 main.py import sqlite3 db = sqlite3.connect("main_db.db") def db_connect(func):

我已经创建了一个装饰器,它充当到Sqlite数据库的连接。在尝试测试正在修饰的函数时,
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
。我投票结束这个问题,因为它似乎只是一个输入错误。如果你仍然不明白,请将问题简化为一个简单的问题,以便更容易写出答案。