断言所有输出——这是一个好习惯吗?
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
对于检查 inputs
的 data-type
非常有用。
示例:
def add_num(num1):
assert isinstance(num1, int), "the num1 should be of type 'int'."
return num1+3
或者当您使用 type-hint
将相应的 arguments
传递给 class
的 object
时,代码可以做得更好。
示例:
def add_num(num1: int):
return num1+3
在Python中,一切都是对象。您拥有的 assert 语句将捕获布尔值、整数、列表等所有内容。
你说有时从数据库返回一个整数。如果这是一个问题,您应该提出错误而不是使用断言语句。
断言应用作现场执行的快速测试,以验证一切都符合您对数据外观的期望,然后再继续进行。请记住,断言语句在生产模式下是禁用的。您只想使用它们来验证您认为永远不可能为真的条件,但就像可以让您放心的快速健全性检查一样,您无论如何都要进行检查。如果有某种方式可以使条件为真,则您应该改用 using exception,以便在生产环境中引发实际错误。
此外,请注意 type hints 可以涵盖许多过去用于 assert 语句的内容。
我在所有输出上使用 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
对于检查 inputs
的 data-type
非常有用。
示例:
def add_num(num1):
assert isinstance(num1, int), "the num1 should be of type 'int'."
return num1+3
或者当您使用 type-hint
将相应的 arguments
传递给 class
的 object
时,代码可以做得更好。
示例:
def add_num(num1: int):
return num1+3
在Python中,一切都是对象。您拥有的 assert 语句将捕获布尔值、整数、列表等所有内容。
你说有时从数据库返回一个整数。如果这是一个问题,您应该提出错误而不是使用断言语句。
断言应用作现场执行的快速测试,以验证一切都符合您对数据外观的期望,然后再继续进行。请记住,断言语句在生产模式下是禁用的。您只想使用它们来验证您认为永远不可能为真的条件,但就像可以让您放心的快速健全性检查一样,您无论如何都要进行检查。如果有某种方式可以使条件为真,则您应该改用 using exception,以便在生产环境中引发实际错误。
此外,请注意 type hints 可以涵盖许多过去用于 assert 语句的内容。