断言所有输出——这是一个好习惯吗?

Assert on all outputs - is that a good practice?

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

#!/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

在对象实例上使用 assert 语句通常不适合您的情况,因为它总是 True.

assert 对于检查 inputsdata-type 非常有用。

示例:

def add_num(num1):
    assert isinstance(num1, int), "the num1 should be of type 'int'."
    return num1+3

或者当您使用 type-hint 将相应的 arguments 传递给 classobject 时,代码可以做得更好。

示例:

def add_num(num1: int):
    return num1+3

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

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

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

此外,请注意 type hints 可以涵盖许多过去用于 assert 语句的内容。