我想使用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()
答案 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的内置函数map
和zip
是函数式编程的经典示例。
不是说这就是这个问题的问题,但你可以在功能上做到这一点:
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()