我相信可讀性和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()
在某些時候,我想重寫模塊,使之能與不同的路徑上的數據庫工作(單元測試,例如)。
那麼,我有什麼選擇?
最直觀的是增加
database_path == ""
變量,然後......什麼?使用setPath(new_path)
函數進行設置,然後將異常(if database_path == "": raise SomeException
)添加到每個函數中,這都很醜,不應該由任何人完成。全功能的類,在初始化時設置
self._database_path
。
然後其被這樣使用:
from database import Database
database = Database("sqlite:///var/database.db")
database.addUser("mike", "Mike Driscoll", "password")
database.listUsers()
這已經是多行的代碼比在第一示例中,與另外的命名問題的:模塊database
在具有稱爲Database
一個類有點笨,不是嗎?
對不起,長時間閱讀,在這裏我最後的問題:
- 爲什麼沒有這樣的東西作爲
__init__
功能模塊,在Python? - 我是否缺少一些東西(靜態類變量等),它可以做我想做的事(在導入時設置一個常量)簡單而乾淨的方式,這仍然離一個簡單的模塊不遠處最初的功能?
P.S.對不起我的英語不好。
編輯:
因此,要明確這一點,此代碼看起來怎麼樣在我的想象力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()
感謝您的提示,但沒有足夠的聲望upvote雖然。仍然不明白爲什麼不能在導入模塊後運行一個函數(請參閱更新到原始文章)。並且仍然認爲,必須記住手動執行此操作(調用setPath),以及將「斷言數據庫路徑」,「數據庫路徑爲空」等重複放置到使用該變量的每個函數中是不好的。 – kolobos 2010-10-05 10:21:45
@kolobos我現在在前面沒有解釋器,但是當模塊被導入時,不是模塊中的代碼_executed_?也就是說,讓你的'__init__'例程的內部語句是全局的。 – mlvljr 2010-10-05 11:02:46
@mlvljr您是對的,當導入模塊時,「全局級」的所有內容都會執行。這裏的問題是如何告訴模塊的數據庫路徑,以及如何做到最「恰當」和優雅的方式。正如你在我的回答中看到的那樣,升級到課程似乎只能走。 – kolobos 2010-10-05 11:36:07