小编ori*_*ral的帖子

处理 PyMySql 异常 - 最佳实践

我的问题是关于异常最佳实践的。我将针对 PyMySQL 的一个特定案例提出我的问题,但它通常涉及错误处理。我正在使用 PyMySQL,在许多可能的异常中,有一个我想以特定方式处理。“重复”异常。

pymysql根据下表将mysql错误映射为python错误:

_map_error(ProgrammingError, ER.DB_CREATE_EXISTS, ER.SYNTAX_ERROR,
       ER.PARSE_ERROR, ER.NO_SUCH_TABLE, ER.WRONG_DB_NAME,
       ER.WRONG_TABLE_NAME, ER.FIELD_SPECIFIED_TWICE,
       ER.INVALID_GROUP_FUNC_USE, ER.UNSUPPORTED_EXTENSION,
       ER.TABLE_MUST_HAVE_COLUMNS, ER.CANT_DO_THIS_DURING_AN_TRANSACTION)
_map_error(DataError, ER.WARN_DATA_TRUNCATED, ER.WARN_NULL_TO_NOTNULL,
       ER.WARN_DATA_OUT_OF_RANGE, ER.NO_DEFAULT, ER.PRIMARY_CANT_HAVE_NULL,
       ER.DATA_TOO_LONG, ER.DATETIME_FUNCTION_OVERFLOW)
_map_error(IntegrityError, ER.DUP_ENTRY, ER.NO_REFERENCED_ROW,
       ER.NO_REFERENCED_ROW_2, ER.ROW_IS_REFERENCED, ER.ROW_IS_REFERENCED_2,
       ER.CANNOT_ADD_FOREIGN, ER.BAD_NULL_ERROR)
_map_error(NotSupportedError, ER.WARNING_NOT_COMPLETE_ROLLBACK,
       ER.NOT_SUPPORTED_YET, ER.FEATURE_DISABLED, ER.UNKNOWN_STORAGE_ENGINE)
_map_error(OperationalError, ER.DBACCESS_DENIED_ERROR, ER.ACCESS_DENIED_ERROR,
       ER.CON_COUNT_ERROR, ER.TABLEACCESS_DENIED_ERROR,
       ER.COLUMNACCESS_DENIED_ERROR)
Run Code Online (Sandbox Code Playgroud)

我想专门捕获 ER.DUP_ENTRY 但我只知道如何捕获 IntegrityError 并且这会导致我的异常捕获中出现多余的情况。

cur.execute(query, values)
except IntegrityError as e:
     if e and e[0] == PYMYSQL_DUPLICATE_ERROR:
          handel_duplicate_pymysql_exception(e, func_a)
     else:
          handel_unknown_pymysql_exception(e, func_b)
except Exception as e:
     handel_unknown_pymysql_exception(e, func_b)
Run Code Online (Sandbox Code Playgroud)

有没有办法简单地只捕获 ER.DUP_ENTRY 一些如何?寻找类似的东西:

except IntegrityError.DUP_ENTRY as e:
     handel_duplicate_pymysql_exception(e, …
Run Code Online (Sandbox Code Playgroud)

python mysql error-handling exception-handling

5
推荐指数
2
解决办法
2万
查看次数

将功能/方法移至类

我希望使用pycharm将方法重构为一个类。(可以使用静态方法)当前:

import math

class Solver(object):
   def __init__(self, a, b, c):
       self.a = a
       self.b = b
       self.c = c


def demo(b, a, c):
   d = b ** 2 - 4 * a * c
   if d >= 0:
       disc = math.sqrt(d)
       root1 = (- b + disc) / (2 * a)
       root2 = (- b - disc) / (2 * a)
       print(root1, root2)
       return root1, root2
   else:
       raise Exception


s = Solver(2, 123, 0.025)
demo(s.b, s.a, s.c)
Run Code Online (Sandbox Code Playgroud)

期望的:

import math …
Run Code Online (Sandbox Code Playgroud)

python refactoring automated-refactoring pycharm

5
推荐指数
1
解决办法
1427
查看次数

如何向类添加前/后方法。Python

假设我有一个 A 类,它有很多方法,但我希望它在调用每个方法之前和之后运行某些行。例如:我希望我的类 Dog 在每次调用 bark() 或 run() 时运行 before() 和 after() 。

class Dog():
    def __init__(self, sound, speed):
        self.sound = sound
        self.speed = speed

    def before(self):
        check_some_things(self)

    def after(self):
        do_some_things(self)

    def bark(self):
        sound(self.sound)

    def run(self):
        move(self.speed)
Run Code Online (Sandbox Code Playgroud)

python oop polymorphism

2
推荐指数
1
解决办法
3751
查看次数

python dictionary用dict.get()行为替换dict []操作符

my_dict = {'a': 1}
Run Code Online (Sandbox Code Playgroud)

我希望my_dict['a']行为与my_dict.get('a') 那种方式相同,如果我这样做my_dict['b'],我不会引发错误但是获取默认None值,就像你从中得到它一样my_dict.get('b')

在my_dict = {'a': {'b': 2}}我可以做的情况下,my_dict['a']['b']它将充当my_dict.get('a').get('b')

这样做的my_dict['b'] = 2时候会一样的my_dict.update({'b': 2})

是否有可能这样做,我不必继承dict?

python inheritance dictionary operator-overloading python-2.7

0
推荐指数
1
解决办法
40
查看次数