在另一个函数中调用第二个函数
我想使用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()
请看到这一天旧线: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'..'
:)
Hance为什么我收回我的 - 并评论你偷偷摸摸的更新。 – 2013-05-04 08:05:32
对不起(我是smuck); P – Torxed 2013-05-04 08:06:47
+1对于很好的回答0特别喜欢2个例子:'print(main())'和'class'版本。 – 2013-05-04 08:21:33
首先 - 你不能命名功能打印,因为这是一个功能已经在python现有的和将返回一个错误。 它看起来像一个class is what you are looking for是你的main(),而不是一个函数。
我不想在这里摇滚,我实际上同意上面的两个答案。也许一个类是正确的路要走,几乎可以肯定,重写本地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最近(过去几年)打开功能编程概念的大门时?它有它的优点(和缺点) - 如果没有,那么Guido作为仁慈的生命的*者就不可能打开这个盒子。
如果你想让a_reader
成为'function',你应该把它作为一个函数来调用,而不是把它作为一个变量来使用。在python将通过使用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()
那么,你定义了两个函数,然后你调用它们。这很简单。你真的打算在main()函数中定义print()函数吗?或者这只是一个缩进错误? – 2013-05-04 08:04:35