首页 > 解决方案 > Python从方法返回多个值或错误的最佳方法

问题描述

如果搜索的值存在于数据库表中,我想创建一个查询数据库并返回 3 个值的方法/函数。如果没有结果或发生错误,我需要识别它,以便在条件语句中使用它。

到目前为止,我有这个:

def read_log(self,ftpsource):
    try:
        conn = pyodbc.connect(...)
        sql_query=f"""Select ID,file_modif_date,size FROM [dbo].[Table] WHERE Source='{ftpsource}'"""
        cursor = conn.cursor()
        cursor.execute(sql_query)
        for row in cursor:
            id=row[0]
            file_mtime=row[1]
            file_size=row[2]
        return('1',id,file_mtime,file_size)
    except Exception as e:
        return('0','0','0','0')

#Call the function
   sql_status,id,time,size = log.read_log('hol1a')
   if sql_status!=0:
       print(id,time,size)
   elif sql_status==0:
       print("Error")

但对我来说看起来不太好。所以我想知道,使用函数返回多个值并确定是否没有值或发生错误的最佳做法是什么?

谢谢!

标签: python-3.x

解决方案


没有一种返回值的最佳方法。

你返回坐标,向量吗?很明显,它将返回一个以上的值,期望什么值?

def get_position2d():
    return x, y 

如果返回的值不明显/有序,您可能需要名称,使用字典!

def get_ingredients():
    return {'sugar': 10, 'salt': 30, 'flour': 150, 'turobo_reactor': 1}

您是否返回用于机器学习的大数据集?使用 Pandas 或 numpy 数组!

import pandas as pd
def get_input_data():
    # Imagine this is a 5k+ entries dataset...
    return pd.DataFrame(dict(
        speed=[1,2,3,4,5], 
        heat=[50,50,35,24,10],
        tire_type=[1,1,1,1,2]))

一条规则是它应该有意义并且应该被视为“一个元素”。对于一个位置,x 和 y 在它们是“位置”的意义上是一个元素。成分也是如此,它们是“一种特定配方的成分”。

所以避免混合无意义的返回值。一项功能,一项工作,一项输出(在当前上下文中)。

最后,您可能需要考虑返回的数据应该是mutable 还是 immutable。如果您以后要修改数据,您可能需要使用列表而不是集合。

现在,关于错误!

如果您谈论的是 Python 错误,则一次只能有一个错误。因此,以下代码应该允许您捕获错误并使用它们。

def i_will_throw_an_error():
    try:
        do_something_bad()
    except:
        do_something_if_a_bad_thing_happens()

现在,如果您谈论错误消息和值,如果提供给您的数据错误,您可能(或可能不)想要触发 Python 错误!

def i_get_bad_data_and_i_raise_it():
    bad_data = get_bad_data()
    if(bad_data['is_really_bad'] is True):
        raise ValueError('Oh no, the data we got is really bad!')

推荐阅读