我想创建一些函数,这些函数从调用一个特定函数开始,然后通过调用另一个函数结束。
每个函数都会使用不同数量的参数,但它们会共享第一行和最后一行。这可能吗?
为了举个例子,我试图用它来创建一组函数,这些函数可以通过sqlalchemy连接到我的数据库,为它添加一个条目,然后退出:
from sqlalchemy import create_engine
from os import path
from common_classes import *
from sqlalchemy.orm import sessionmaker
def loadSession():
db_path = "sqlite:///" + path.expanduser("~/animal_data.db")
engine = create_engine(db_path, echo=False)
Session = sessionmaker(bind=engine)
session = Session()
Base.metadata.create_all(engine)
return session, engine
def add_animal(id_eth, cage_eth, sex, ear_punches, id_uzh="", cage_uzh=""):
session, engine = loadSession()
new_animal = Animal(id_eth=id_eth, cage_eth=cage_eth, sex=sex, ear_punches=ear_punches, id_uzh=id_uzh, cage_uzh=cage_uzh)
session.add(new_animal)
commit_and_close(session, engine)
def add_genotype(name, zygosity):
session, engine = loadSession()
new_genotype = Genotype(name=name, zygosity=zygosity)
session.add(new_animal)
commit_and_close(session, engine)
def commit_and_close(session, engine):
session.commit()
session.close()
engine.dispose()
同样,我要做的是将add_animal()
和add_genotype()
(以及前瞻性更多的函数)折叠到一个构造函数中。
我想也许我可以使用一个类,虽然我相信loadSession()
可以从__init__
调用,但我不知道如何在最后调用commit_and_close()
函数 - 也不管如何管理每个子类的可变数量的参数......
答案 0 :(得分:2)
不要为每个类型add_X
设置X
个函数,只需创建一个add
函数,添加一个在函数“外部”创建的对象:
因此add_animal(params…)
变为add(Animal(params…))
,add_genotype(params…)
变为add(Genotype(params…))
。
这样,您的add
功能就像这样:
def add (obj):
session, engine = loadSession()
session.add(obj)
commit_and_close(session, engine)
然后由该函数的调用者来创建对象,这将打开界面并允许您从其他地方获取对象。例如。这样的事情也是可能的:
for animal in zoo.getAnimals():
add(animal)