2014-03-06 28 views
1

假设我有一个功能为spamham的模块,它们使用函数eggsfoo。现在在Python中分组相关函数

def spam(): 
    eggs() 
    foo() 
    ... 

def ham(): 
    eggs() 
    foo() 
    ... 

eggsfoo只使用spamham,所以它没有任何意义,以在模块级揭露他们。我可以将它们的名称更改为_eggs_foo以表明它们用于内部使用,但这并不确实建立spam,ham,eggsfoo之间的关系。

所以,我可以做一个容器类来保存这些函数是这样的:

class SpamHam: 

    @staticmethod 
    def _eggs(): 
     ... 

    @staticmethod 
    def _foo(): 
     ... 

    @staticmethod 
    def spam(): 
     ...   

    @staticmethod 
    def ham(): 
     ... 

但是,因为我希望用户不要实例SpamHam,只用它来调用静态方法,这似乎skethy。另外,当我想要的是在它的方法之间建立一些关系时,使用一个类似乎并不正确。

我可以创建一个名为spamham一个独立的模块,并把这些四个功能成,但spamham真的做“属于”他们已经在该模块。

那么,什么是建立这种正确的方法Python中的关系?

回答

4

一般来说,我建议不要把这些事情看作是函数之间的具体关系。功能应该是代码为的独立单元。我的中心论点是你不应该认为eggs属于spamhameggs不应该在乎它是否被spamhambacontoast调用。重要的是,eggs有一个名称,尽可能清楚地告诉你什么功能确实

诀窍是要弄清楚你希望人们在外面访问...确定它是否是eggs(公共)或_eggs(实现细节可能会改变,恕不另行通知),因为你已经提到,其功能至。

这并不是说函数不能调用其他函数
优选正确想法有关的功能是什么... :)

+1

还考虑在你的模块上使用'__all__'。 – kindall

+2

@kindall - 当然。这没有什么坏处。我想它会给出另一层“顺便说一句,这是一个公开的名字”。但个人而言,我从来没有发现'__all__'的很多用途。 ''从blah导入'''应该得到他们的代码发生的任何不好的事情;-) – mgilson

+1

'help(modulename)'尊重'__all__',所以它在我看来非常有用。 – kindall