2013-05-04 155 views
-2

我想使用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() 
+1

那么,你定义了两个函数,然后你调用它们。这很简单。你真的打算在main()函数中定义print()函数吗?或者这只是一个缩进错误? – 2013-05-04 08:04:35

回答

2

请看到这一天旧线:What is the Pythonic way to avoid reference before assignment errors in enclosing scopes?
在该职位的用户也会有同样的问题,他想定义另一个函数中的一个函数(在你的情况main)由我和其他人你不劝都t巢功能!

没有必要在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() 

哦,顺便说一句,并用..反斜杠字符串应该进行转义或需要使用r'..' :)

+0

Hance为什么我收回我的 - 并评论你偷偷摸摸的更新。 – 2013-05-04 08:05:32

+0

对不起(我是smuck); P – Torxed 2013-05-04 08:06:47

+0

+1对于很好的回答0特别喜欢2个例子:'print(main())'和'class'版本。 – 2013-05-04 08:21:33

0

首先 - 你不能命名功能打印,因为这是一个功能已经在python现有的和将返回一个错误。 它看起来像一个class is what you are looking for是你的main(),而不是一个函数。

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最近(过去几年)打开功能编程概念的大门时?它有它的优点(和缺点) - 如果没有,那么Guido作为仁慈的生命的独裁者就不可能打开这个盒子。

0

如果你想让a_reader成为'function',你应该把它作为一个函数来调用,而不是把它作为一个变量来使用。在将通过使用a_reader()

以下实施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() 
相关问题