【问题标题】:Imported Function Failure导入函数失败
【发布时间】:2015-08-24 09:57:56
【问题描述】:

当我通过导入使用函数时,为什么会失败?它说“重新”未定义。我还尝试使用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 Notebook 上使用 Python 3
  • 在没有导入的情况下使用该函数可以正确运行
  • 【问题讨论】:

    • 我很确定 re 需要成为一个类.. 然后你会这样做:`from re import x' 可能为什么它不起作用
    • 哎呀。忘了补充说我的函数里面有import re。接得好。 (我只是忘了把那行放在堆栈溢出中)。您的答案不正确,因为re 是我用于字符串处理的模块。这就是为什么我的函数可以正常运行(没有被导入)。我只是不明白为什么它现在不运行(导入后)。
    • 是不是就像您之前在脚本中错过了import re,然后将其导入ipython,但由于该错误而失败,然后您通过添加import re 修复它然后再次导入到同一个 ipython 会话后,它仍然不起作用?
    • @Rafeh 你向我们展示的错误是说你没有导入re,现在你告诉我们你只是碰巧忘记了包含@ 987654330@进入stackoverflow代码?我不想称你为骗子,但也许你的问题是你没有导入re
    • 在复制和粘贴到这里之前,我恢复到了不正确的代码版本。我之前发现了import re 问题,并且它不在我的函数中,所以我更新了它。但是我发现了问题。在对 q1.py 文件进行更改后,我不得不关闭当前的 Ipython 笔记本并重新打开它。更改为import re。 @MarkusMeskanen 您的评论让我考虑重新启动浏览器并在放弃之前再次尝试,所以谢谢哈哈。你的评论让我重新思考。我已经在那里敲了一段时间的头。很抱歉这么简单的解决方案!

    标签: python python-3.x ipython-notebook python-import


    【解决方案1】:

    我猜问题可能是您首先创建了脚本并错过了输入import re,然后当您在 python 中运行该函数时,出现了该错误。

    然后,您通过导入re 更正了文件,然后在您尝试运行该函数时再次在同一个 ipython 会话中,它仍然出错。你的话——

    我还尝试使用def x(): return 5+5 之类的基本函数,但也引发了错误。

    让我相信是这样的。

    如果上面是正确的,那么问题是,一旦你将一个模块导入 Python,Python 会将该模块缓存在 sys.modules 中,所以如果你尝试在同一个 Python 会话中再次导入它,你会得到相同的模块(这意味着您将获得相同的功能)。

    要解决这个问题,最简单的方法是关闭 ipython 会话,然后再次打开它,然后再次导入。

    不涉及关闭 Python 终端的解决方案是使用 importlib.reload() 。如果q1 是模块,Example -

    from Galvanize import q1
    import importlib
    importlib.reload(q1)
    

    【讨论】:

    • 是的,关闭和重新打开就是这样!此外,importlib.reload(foo) 真的很有用!谢谢!
    【解决方案2】:

    如果你想在函数中使用模块“re”,“re”的导入应该在定义函数的同一个文件中。另一种方法是在函数中导入“re”,就像您在第二个代码 sn-p 中所做的那样。

    import re
    
    def f():
        return re.findall(r'hello', 'hello world')
    

    【讨论】:

    • "另一种方法是在函数中导入re,就像您在第二个代码 sn-p 中所做的那样。"所以他的导入已经是正确的,你的回答对他有什么帮助?
    • 一般做法是在函数内部还是外部import re更好?还有为什么会有这么多反对票?
    • @Rafeh 外面。作为一般做法。
    • 我误解了这个问题,意思是对于@Rafeh,两件事之一是有效的。如果他在调用文件中导入re,它不起作用,但在函数中导入它是可行的。从这个意义上说,我的回答有些帮助。 :)
    • @Rafeh,名称应导入将要使用的文件中。因此,这与导入调用与被调用文件无关。我正在回答您的特定背景。
    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 2013-05-30
    • 2011-06-23
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2018-03-17
    相关资源
    最近更新 更多