在另一个函数中调用第二个函数

时间:2013-05-04 07:54:25

标签: python function

我想使用a_reader函数打开一个文件。然后我想使用第二个函数来打印文件。我想这样做是因为我希望能够稍后调用打开的文件函数而不打印它。有关最佳方法的任何想法吗?这是一个我知道不起作用的示例代码,但它可能有助于解释我想要做什么

 def main ():        
        a_reader = open ('C:\Users\filexxx.csv','r')      
        fileName = a_reader.read()
        a_reader.close()

    def print():
        print fileName



main()
print()

4 个答案:

答案 0 :(得分:2)

请查看今天的旧帖子:What is the Pythonic way to avoid reference before assignment errors in enclosing scopes?
该帖子中的用户有完全相同的问题,他想在另一个函数(在你的情况下为main)中定义一个函数,因为我和其他人都没有嵌套函数!

没有必要在Python中使用嵌套函数,它只是增加了无用的复杂性,并没有给你带来任何真正的实际优势。

我愿意:

def main ():
    a_reader = open ('C:\\Users\\filexxx.csv','r')      

    fileName = a_reader.read()

    a_reader.close()
    return fileName

print(main())

class main():
    def __init__(self):
        a_reader = open ('C:\\Users\\filexxx.csv','r')
        self.fileName = a_reader.read()
        a_reader.close()
    def _print(self):
        print(self.fileName)

a = main()
a._print()

从不将一个函数/类名定义为与默认Python函数/类相同的好主意。 print是其中之一。


但如果您真的想要使用原始设置,那么这是一个解决方案:

def main ():
    a_reader = open ('C:\\Users\\filexxx.csv','r')
    fileName = a_reader.read()
    a_reader.close()

    def _print():
        print fileName

    _print()

main()

哦,btw ..带有反斜杠的字符串应该被转义,或者你需要使用r'..':)

答案 1 :(得分:0)

首先 - 您不能将您的函数命名为print,因为这是python中已存在的函数,并将返回错误。 而class is what you are looking for似乎是你的主要(),而不是函数。

答案 2 :(得分:0)

我不想在这里摇摇欲坠,我实际上同意上述两个答案。也许一个类是正确的方法,几乎​​可以肯定,覆盖原生的print()函数是不明智的。

Python的优势之一是它涵盖了一系列编程范例。你想要一个直接的,程序化的实现--Python!您希望重用代码并制作一些通用的,可重用的类--OOP和Python! Python还允许进行函数式编程 - Python的内置函数mapzip是函数式编程的经典示例。

不是说这就是这个问题的问题,但你可以在功能上做到这一点:

def my_name_function(n):
    return ' '.join(['This is my Name:', n])

def say_hello(x):
    print('Hello, world!', x)

say_hello(my_name_function('Nick'))
--> Hello, world! This is my Name: Nick

同样,我认为这不是问题的真正问题。我同意,在这种情况下,在OOP意义上,最佳实现将是一个类。 (可能是更多的Pythonic方式:p)

但是,要说Python中不需要嵌套函数,那么当Python给我们打开这个选项时呢?当Python最近(过去几年)打开了功能编程概念的大门?它确实有它的优点(和缺点) - 如果没有,那么作为仁慈的生活独裁者的圭多就不会打开这个盒子。

答案 3 :(得分:0)

如果您希望a_reader成为'函数',则应将其称为函数,而不是将其用作变量。在使用a_reader()的{​​{3}}中。

以下实现了一个类Reader,其中一个实例a_reader可以作为函数调用。只有在调用时才会打开文件。与已经指出的其他人一样,您应该在字符串文字("..\\..")中转义反斜杠,或者使用原始字符串(r"..\..")。将普通代码放在if __name__ == '__main__':语句下的python文件中也是一种好习惯,这样就可以从文件中导入函数/类而无需调用(测试)代码。

class Reader(object):
    def __init__(self, file_name):
        self._file_name = file_name
        self._fp = None

    def __call__(self):
        if self._fp:
            return self._fp
        return open(self._file_name, 'r')

def main():
    a_reader = Reader(r"C:\\Users\\filexxx.csv")
    # no file opened yet
    file_content = a_reader().read()
    a_reader().close()
    print file_content

if __name__ == '__main__': # only call main() if not imported
    main()