首页 > 解决方案 > 断言所有输出 - 这是一个好习惯吗?

问题描述

我在所有输出上都使用断言是一个好习惯吗?这段代码也干净易读吗?谢谢!

#!/usr/bin/env python

import pyodbc
import secret as credentials

class DatabaseManager:
    def __init__(self):
        self.database_user_name = credentials.Secret.mssql["database_username"]
        self.database_password = credentials.Secret.mssql["database_password"]
        self.database_server_name = credentials.Secret.mssql["database_server"]
        self.database_name = credentials.Secret.mssql["database_name"]
        self.database_string = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER=' \
                               + self.database_server_name + ';DATABASE=' \
                               + self.database_name + ';UID=' \
                               + self.database_user_name + ';PWD=' \
                               + self.database_password \
                               + ';Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;'
        self.database_connection = pyodbc.connect(self.database_string)


class AccountManager:
    def __init__(self, account_email, account_name):
        self.account_email = account_email
        self.account_name = account_name

    def get_account_by_email(self):
        db_init = DatabaseManager()
        db_cursor = db_init.database_connection.cursor()
        db_cursor.execute("""  SELECT [account_email] FROM  [dbo].[account] 
                               WHERE account_email = ? """, self.account_email)
        row: object = db_cursor.fetchone()

        # verify and return
        assert isinstance(row, object)
        print(row)

    def get_account_by_name(self):
        db_init = DatabaseManager()
        db_cursor = db_init.database_connection.cursor()
        db_cursor.execute("""   SELECT [account_name] FROM  [dbo].[account] 
                                WHERE account_name = ? """, self.account_name)
        row: object = db_cursor.fetchone()

        # verify and return
        assert isinstance(row, object)
        print(row)


class ContractManager:
    def __init__(self):
        pass

标签: pythoncoding-style

解决方案


在 Python 中,一切都是对象。你拥有的 assert 语句将捕获布尔值、整数、列表等所有内容。

在此处输入图像描述

您说过有时会从数据库返回一个整数。如果这是一个问题,您应该引发错误而不是使用断言语句。

断言应用作现场执行的快速测试,以验证一切是否符合您对数据外观的期望,然后再继续进行。请记住,断言语句在生产模式下被禁用。您只想使用它们来验证您认为永远不可能正确的条件,但就像可以让您放心的快速理智检查一样,您无论如何都要进行检查。如果有某种方式可以使条件为真,您应该改用异常,以便在生产环境中引发实际错误。

另外,请注意,类型提示可以涵盖许多断言语句曾经用于的事情。


推荐阅读