gpt4 book ai didi

python - 从小脚本过渡到更大的应用程序并不容易

转载 作者:行者123 更新时间:2023-12-02 05:57:03 24 4
gpt4 key购买 nike

我相信可读性和KISS原则是编程中最重要的事情。这就是我使用 Python 的原因:)
这是我经常遇到的具体情况:

假设,我有一个漂亮且干净的脚本,它是数据库处理的包装器:

import database_schema as schema
loader = schema.Loader("sqlite:///var/database.db")
session = loader.session

def addUser(name, full_name, password):
user = schema.User(name, full_name, password)
session.add(user)
session.commit()

def listUsers():
all_users = session.query(schema.User).all()
return all_users

使用方式如下:

import database
database.addUser("mike", "Mike Driscoll", "password")
database.listUsers()

在某些时候,我想重写该模块,以便它可以与不同路径上的数据库一起使用(例如,用于单元测试)。

那么,我有什么选择?

  1. 最直观的就是添加database_path == ""变量,然后...什么?使用 setPath(new_path) 函数设置它,然后向每个函数添加异常 (if database_path == "": raise SomeException) ,这很丑陋,不应该任何人都可以完成。

  2. 全功能类,在初始化时设置self._database_path

然后这样使用:

from database import Database
database = Database("sqlite:///var/database.db")
database.addUser("mike", "Mike Driscoll", "password")
database.listUsers()

这已经比第一个示例中的代码行数更多了,并且还增加了命名问题:在模块 database 中有一个名为 Database 的类有点愚蠢,不是吗?

抱歉读得太长了,这是我的最后一个问题:

  1. 为什么 Python 中没有诸如 __init__ 之类的模块函数?
  2. 我是否缺少一些东西(静态类变量等),它可以以简单而干净的方式做我想要的事情(在导入时设置的常量),这距离具有一堆简单的模块仍然不远最初的功能是什么?

附注对不起我的英语。

编辑:

所以,为了弄清楚这一点,这段代码在我富有想象力的 Python 宇宙中可能是什么样子:

import database_schema as schema

def __init__(database_path):
loader = schema.Loader(database_path)
global session
session = loader.session

def addUser(name, full_name, password):
user = schema.User(name, full_name, password)
session.add(user)
session.commit()

def listUsers():
all_users = session.query(schema.User).all()
return all_users

像这样使用:

import database("sqlite:///var/database.db")

database.addUser("mike", "Mike Driscoll", "password")
database.listUsers()

最佳答案

模块是一个 Python 对象,具有可以绑定(bind)和引用的任意命名的属性。名为 mod 的模块的 Python 代码通常驻留在名为 mod.py 的文件中。当您尝试导入它时,会创建一个新的命名空间,其中包含该模块的所有属性。

尽管如此,它与类和该类的对象实例的创建不同。这些是不同的抽象,应该这样使用。

而不是测试

if database_path == "":
....

以Python方式实现

if database_path:
....

您可以使用断言,而不是引发异常

assert database_path != "", 'database path empty'

模块不像类的对象实例那样存在。每次导入模块时,导入模块都会创建一个具有相同属性集的命名空间。在这种情况下,init可能没有多大意义。

您提供的第二种形式的代码没有任何问题。如果您不想这样做,上面的一些习语可能会减轻您的痛苦:)

关于python - 从小脚本过渡到更大的应用程序并不容易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3861916/

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