导入函数失败
Imported Function Failure
为什么我的函数在通过导入使用时会失败?它说 "re" 未定义。我还尝试使用像 def x(): return 5+5
这样的基本函数,但它也引发了错误。
作为导入使用时函数失败
import re
from sys import argv
from Galvanize import q1
f = open('git_script.txt','r')
q1.text_content_analyzer(f)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-82-cdff728a66aa> in <module>()
1 f = open('git_script.txt','r')
----> 2 q1.text_content_analyzer(f)
/Users/Rafeh/Dropbox/github/Galvanize/q1.py in text_content_analyzer(f)
6 wordsCount = {}
7
----> 8 for line in f:
9 nbOfSentences += len(re.split(r'[.!?]+', line.strip()))-1
10 lineWords = line.split()
NameError: name 're' is not defined
函数正常运行成功
def text_content_analyzer(f):
import re
words = []
nbOfSentences = 0
punctuation = []
wordsCount = {}
for line in f:
nbOfSentences += len(re.split(r'[.!?]+', line.strip()))-1
lineWords = line.split()
words = words + lineWords
for word in lineWords:
if word in wordsCount:
wordsCount[word] += 1
else:
wordsCount[word] = 1
print("Total word count: %1.0f" %len(words))
print(wordsCount)
print("Unique words: " , len(wordsCount.keys()))
print(nbOfSentences)
return len(words), wordsCount, len(wordsCount.keys()), nbOfSentences
现在我只是在测试和学习如何使用我自己的函数,但我目前在这里遇到了问题。
函数是我自己的,保存在本地。
在 IPython 笔记本上使用 Python 3
在没有导入的情况下使用该函数可以正确运行
如果要在函数内部使用模块 "re","re" 的导入应该在定义函数的同一个文件中。另一种方法是像在第二个代码片段中所做的那样在函数中导入 "re"。
import re
def f():
return re.findall(r'hello', 'hello world')
我猜问题可能是您首先创建了脚本并错过了 import re
,然后当您 运行 python 中的函数时,您遇到了那个错误。
稍后,您通过导入 re
更正了文件,然后在同一 ipython 会话中再次尝试 运行 该函数时,它仍然出错。你的话-
I also tried using a basic function like def x(): return 5+5
and that threw an error as well.
让我相信是这样。
如果以上是正确的,那么问题是,一旦您将模块导入 Python,Python 会将模块缓存在 sys.modules
中,因此如果您尝试导入再次在同一个 Python 会话中,您将获得相同的模块(这意味着您将获得相同的功能)。
要解决此问题,最简单的方法是关闭 ipython 会话,然后重新打开,然后再次导入。
不涉及关闭 Python 终端的解决方案是使用 importlib.reload()
。如果 q1
是模块,示例 -
from Galvanize import q1
import importlib
importlib.reload(q1)
为什么我的函数在通过导入使用时会失败?它说 "re" 未定义。我还尝试使用像 def x(): return 5+5
这样的基本函数,但它也引发了错误。
作为导入使用时函数失败
import re
from sys import argv
from Galvanize import q1
f = open('git_script.txt','r')
q1.text_content_analyzer(f)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-82-cdff728a66aa> in <module>()
1 f = open('git_script.txt','r')
----> 2 q1.text_content_analyzer(f)
/Users/Rafeh/Dropbox/github/Galvanize/q1.py in text_content_analyzer(f)
6 wordsCount = {}
7
----> 8 for line in f:
9 nbOfSentences += len(re.split(r'[.!?]+', line.strip()))-1
10 lineWords = line.split()
NameError: name 're' is not defined
函数正常运行成功
def text_content_analyzer(f):
import re
words = []
nbOfSentences = 0
punctuation = []
wordsCount = {}
for line in f:
nbOfSentences += len(re.split(r'[.!?]+', line.strip()))-1
lineWords = line.split()
words = words + lineWords
for word in lineWords:
if word in wordsCount:
wordsCount[word] += 1
else:
wordsCount[word] = 1
print("Total word count: %1.0f" %len(words))
print(wordsCount)
print("Unique words: " , len(wordsCount.keys()))
print(nbOfSentences)
return len(words), wordsCount, len(wordsCount.keys()), nbOfSentences
现在我只是在测试和学习如何使用我自己的函数,但我目前在这里遇到了问题。
如果要在函数内部使用模块 "re","re" 的导入应该在定义函数的同一个文件中。另一种方法是像在第二个代码片段中所做的那样在函数中导入 "re"。
import re
def f():
return re.findall(r'hello', 'hello world')
我猜问题可能是您首先创建了脚本并错过了 import re
,然后当您 运行 python 中的函数时,您遇到了那个错误。
稍后,您通过导入 re
更正了文件,然后在同一 ipython 会话中再次尝试 运行 该函数时,它仍然出错。你的话-
I also tried using a basic function like
def x(): return 5+5
and that threw an error as well.
让我相信是这样。
如果以上是正确的,那么问题是,一旦您将模块导入 Python,Python 会将模块缓存在 sys.modules
中,因此如果您尝试导入再次在同一个 Python 会话中,您将获得相同的模块(这意味着您将获得相同的功能)。
要解决此问题,最简单的方法是关闭 ipython 会话,然后重新打开,然后再次导入。
不涉及关闭 Python 终端的解决方案是使用 importlib.reload()
。如果 q1
是模块,示例 -
from Galvanize import q1
import importlib
importlib.reload(q1)