导入函数失败

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)