【问题标题】:How to use errors codes stored in the separate module如何使用存储在单独模块中的错误代码
【发布时间】:2020-02-05 19:59:04
【问题描述】:

errors.py 模块中,我定义了几个错误,例如:

INCORRECT_USERNAME = -2417
INCORRECT_PASSWORD = -2426
PASSWORD_EXPIRED = -2430
ACCOUNT_DISABLED = -2431

现在,我将此模块导入另一个 Python 脚本并检查错误代码是否匹配:

import errors 


def get_error_name():
    returned_code = some_function(some_argument)

    if returned_code == errors.INCORRECT_USERNAME:
        return "INCORRECT_USERNAME"
    elif returned_code == errors.INCORRECT_PASSWORD:
        return "INCORRECT_PASSWORD"
    elif returned_code == errors.PASSWORD_EXPIRED:
        return "PASSWORD_EXPIRED"
    elif returned_code == errors.ACCOUNT_DISABLED:
        return "ACCOUNT_DISABLED"

生成的代码似乎过于冗长或过于冗长。 有没有更简洁的方法来返回错误信息的字符串值?

【问题讨论】:

  • 你不能在函数之外使用return...
  • 感谢通知!

标签: python


【解决方案1】:

这似乎是Enum 的一个很好的用例:

# errors.py
import enum

class Error(enum.IntEnum):
    INCORRECT_USERNAME = -2417
    INCORRECT_PASSWORD = -2426
    PASSWORD_EXPIRED   = -2430
    ACCOUNT_DISABLED   = -2431



# another_script.py
import errors 

def get_error_name():
    returned_code = some_function(some_argument)
    return errors.Error(returned_code).name

或者,如果您想要返回的不仅仅是错误名称,您可以考虑使用namedtuple

# errors.py
import collections

Error = collections.namedtuple('Error', ['name', 'msg'])
all_errors = {
    -2417: Error('INCORRECT_USERNAME', 'The provided username was incorrect'),
    -2426: Error('INCORRECT_PASSWORD', 'The provided password was incorrect'),
    -2430: Error('PASSWORD_EXPIRED',   'Your password has expired'),
    -2431: Error('ACCOUNT_DISABLED',   'Your account is disabled'),
}



# another_script.py
import errors 

def get_error_name():
    returned_code = some_function(some_argument)
    return errors.all_errors[returned_code].name

def get_error_msg():
    returned_code = some_function(some_argument)
    return errors.all_errors[returned_code].msg

【讨论】:

  • 一个小问题:由于缺少else 子句,原始代码似乎暗示some_function 可能返回的不是预期的错误号。 (虽然这可以通过捕获ValueError 来处理,该ValueError 将为未定义的返回值引发。)
【解决方案2】:

您可以使用字典来执行此操作:

errors.py

error_dict = {
    -2417: "INCORRECT_USERNAME",
    -2427: "INCORRECT_PASSWORD",
    -2430: "PASSWORD_EXPIRED",
    -2431: "ACCOUNT_DISABLED"
}
from errors import error_dict

def get_error_name():
    returned_code = some_function(some_argument)

    # use this syntax instead of errors.error_dict[returned_code] to handle
    # invalid return code. could use a try / except KeyError also
    return error_dict.get(returned_code, "INVALID_CODE")

【讨论】:

    【解决方案3】:

    您最好的选择是使用字典,它与 C 或 C++ 等其他语言中的 switch...case 语句最等效:

    def error_handler(error_code: int) -> str:
        return {
            -2417: 'INCORRECT_USERNAME',
            -2426: 'INCORRECT_PASSWORD',
            -2430: 'PASSWORD_EXPIRED',
            -2431: 'ACCOUNT_DISABLED',
        }.get(error_code, 'DEFAULT_ERROR_MESSAGE')
    

    【讨论】:

      猜你喜欢
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多