声明内部函数的大多数pythonic方法

时间:2019-03-24 03:10:49

标签: python python-3.x

我正在编写一个程序,其中im使用两个主要函数,但是这两个函数都使用相同的内部函数。我想知道如何以大多数pythonic方式编写它们?我的观点是将那些帮助程序隐藏在内部某个地方,并且不要重复执行帮助程序功能。

def main_function1():
    helper1()
    helper2()
    #dowork1

def main_function2()
    helper1()
    helper2()
    #dowork2

def helper1()
    #workhelp1

def helper2()
    #workhelp2

我能弄清楚的唯一合理的解决方案是使用..私有函数声明静态类?但由于:

Strictly speaking, private methods are accessible outside their class, 
just not easily accessible. Nothing in Python is truly private[...]

我被困住了,没有想法。

发件人:http://www.faqs.org/docs/diveintopython/fileinfo_private.html

主题:Why are Python's 'private' methods not actually private?

我还考虑过使用内部助手和切换器声明一个主要函数,以确定应该运行哪个函数,但是我认为那是很差的解决方案。

目前,我认为最准确的方法是将普通类声明为:

class Functions:
    def main_function1(self):
        print("#first function#")
        self.helper1()
        self.helper2()

    def main_function2(self):
        print("#second function#")
        self.helper1()
        self.helper2()

    def helper1(self):    
        print("first helper")

    def helper2(self):
        print("second helper")

Functions().main_function1()
Functions().main_function2()
print("###")
Functions().helper1()

输出:

#first function#
first helper
second helper
#second function#
first helper
second helper
###
first helper

但是在这里我也可以访问帮助程序,这没什么大不了的,但是仍然给我一个奇怪的理由。

2 个答案:

答案 0 :(得分:4)

Python中没有私有函数。相反,通过在要用非公开方式表示的方法名称前加下划线,可以向您的类用户发送信号,告知这些方法不应在外部调用:

class Functions:
    def main_function1(self):
        print("#first function#")
        self._helper1()
        self._helper2()

    def main_function2(self):
        print("#second function#")
        self._helper1()
        self._helper2()

    def _helper1(self):    
        print("first helper")

    def _helper2(self):
        print("second helper")

这符合“我们都同意成年人在这里”的原则-您可以触摸课程的非公开方法,但是如果使用不当,那就在您自己的头上。

答案 1 :(得分:0)

尝试一下

def get_main(name):
    def helper1():
        print("helper1")
    def helper2():
        print("helper2")
    def main1():
        print("Running helpers from main1")
        helper1()
        helper2()
    def main2():
        print("Running helpers from main2")
        helper1()
        helper2()
    if name == "main1":
        return main1
    if name == "main2":
        return main2


main1 = get_main("main1")
main2 = get_main("main2")

然后可以按以下方式运行该功能:

main1()
main2()
helper1()

输出:

Running helpers from main1
helper1
helper2
Running helpers from main2
helper1
helper2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'helper1' is not defined