-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()
4

4 回答 4

2

请参阅今天的旧线程:在封闭范围内分配错误之前避免引用的 Pythonic 方法是什么?
该帖子中的用户遇到了完全相同的问题,他想按照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()

哦,顺便说一句..带反斜杠的字符串应该被转义或者你需要使用r'..':)

于 2013-05-04T08:00:51.270 回答
0

首先 - 你不能将你的函数命名为 print 因为这是一个已经存在于 python 中的函数并且会返回一个错误。看起来你正在寻找一个类作为你的 main(),而不是一个函数。

于 2013-05-04T07:58:58.417 回答
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 作为终生仁慈的独裁者就不可能打开这个盒子。

于 2013-05-04T08:17:34.537 回答
0

如果你想a_reader成为“函数”,你应该把它当作一个函数来调用,而不是把它当作一个变量来使用。在中,这将是通过使用a_reader().

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

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()
于 2013-05-04T08:59:21.957 回答