gpt4 book ai didi

Python重构: cleaning up imports

转载 作者:行者123 更新时间:2023-12-01 06:05:15 24 4
gpt4 key购买 nike

这可能是一个新手类型的问题(我从 PHP5 OO 转向 python),但是在尝试清理和重构一些内容时,我对 import 语句有一些不确定的事情我们的 Python 模块。

比方说,我有一个导入 mysqldb 的数据库连接工厂模块,看起来像这样:

import MySQLdb as mysql
from MySQLdb import cursors
class ConnectionFactory():
@staticmethod
def connect(db_host,db_user,db_pass,db,cursor='DictCursor'):
connection = mysql.connect(host = db_host,
user = db_user,
passwd = db_pass,
db = db,
cursorclass=getattr(mysql.cursors, cursor))
cur = connection.cursor();
connection.ping(True)
return (cur,connection)

首先,为什么需要显式获取游标的第二次导入?如果没有它,我似乎无法访问 mysql.cursors。

此外,假设另一个模块导入此模块以获取数据库连接,然后使用它执行查询。

import ConnectionFactory
def runquery(q):
try:
cur,connection = ConnectionFactory.connect(db_host,db_user,db_pass,db)
cur.execute(q)
res = cur.fetchall()
return res
except Exception as e:
log(str(e))

理想情况下,被捕获的异常应该是 MySQLdb.Error 异常。 这是否意味着我也需要在这里导入 MySQLdb?我认为有一种更优雅的方法可以做到这一点。我确信我的思维方式不像 Pythonista。

最后,假设这两个模块都导入到另一个父模块中以在 WSGI 中使用(我通过 Werkzeug 输入所有内容,然后它在其他模块中运行大量其他方法)

如果 WSGI 导入这两个模块,我假设它们单独导入的内容不在其 namespace 中。 如果最终它们将在一个更大的模块中一起使用,那么在多个模块中进行相同的导入是否是一种不好的做法?

编辑:为了澄清第三个问题,我有一个特殊的 json 编码器,它在各处用作 json.dumps()

cls arg
from datetime import datetime
import gnengine
import json

class SpecialEncoder(json.JSONEncoder):
def default(self,obj):
if isinstance(obj,set):
return list(obj)
elif isinstance(obj,datetime):
return obj.isoformat()
elif isinstance(obj,gnengine.searchresult):
return obj.jsonify()

return json.JSONEncoder.default(self,obj)

gnengine 是我的 WSGI,searchresult 是在该模块中找到的类型。我在这里导入它是因为它有我的编码器需要的自己的 json 方法。但这个编码器显然也是为了在 gnengine 中使用而导入的。它们本质上是相互导入的。

我的 PHP 背景告诉我,如果 searchresult 类型成为代表对象模型的自己的模块,然后分别导入该模块,那么这一切都可以解决。我不确定这是否是我的一个很大的误解。

很抱歉将三个问题合二为一,我想本质上是对一般导入的澄清。我得到了命名空间以及为什么 from name import * 是一个坏主意,我只是不明白当一起使用的多个包都具有相似的依赖关系时最好的方法。 python 中是否期望有相同的 import 贯穿始终?

最佳答案

  1. 我相信 MySQLdb.cursors 是另一个模块,并且嵌套模块必须单独导入

  2. 如果您想专门捕获 MySQLdb 中声明的异常,那么是的,您将必须导入某些内容。如果您想捕获任何异常,那么您不必导入。 但这可能并不可取,正如 @tkone 在下面的评论中解释的那样。无论如何,我没有看到从 MySQLdb 导入某些内容的问题 - 如果您的数据库访问代码没有分布在多个模块上,而是集中在数据库访问层中,那么您不会有太多从 MySQLdb 导入的模块。

  3. 我不确定我是否理解这个问题。能解释一下吗?

关于Python重构: cleaning up imports,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8329442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com