创建一组Python函数

时间:2015-11-22 19:28:27

标签: python function class constructor sqlalchemy

我想创建一些函数,这些函数从调用一个特定函数开始,然后通过调用另一个函数结束。

每个函数都会使用不同数量的参数,但它们会共享第一行和最后一行。这可能吗?

为了举个例子,我试图用它来创建一组函数,这些函数可以通过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()函数 - 也不管如何管理每个子类的可变数量的参数......

1 个答案:

答案 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)