测试python时未定义全局名称

时间:2017-01-31 08:16:09

标签: python

我正在运行一个python代码。运行后,代码运行良好,但在测试代码时显示

  

nameError未定义全局名称。

这是代码

def is_isogram(word):
    if type(word)== str:
        for i in word:
            if word.count(i) >1 or word == "":
                return (word, False)
            else:
                return (word, True)
    else:
        raise TypeError ("'{}' should be a string" .format(word))

这是测试代码

from unittest import TestCase

class IsogramTestCases(TestCase):
  def test_checks_for_isograms(self):
    word = 'abolishment'
    self.assertEqual(
      is_isogram(word),
      (word, True),
      msg="Isogram word, '{}' not detected correctly".format(word)
    )

  def test_returns_false_for_nonisograms(self):
    word = 'alphabet'
    self.assertEqual(
      is_isogram(word),
      (word, False),
      msg="Non isogram word, '{}' falsely detected".format(word)
    )

  def test_it_only_accepts_strings(self):
    with self.assertRaises(TypeError) as context:
      is_isogram(2)
      self.assertEqual(
        'Argument should be a string',
        context.exception.message,
        'String inputs allowed only'
      )

3 个答案:

答案 0 :(得分:0)

您的问题并不完全清楚,但我会尝试正确回答。

您的Global name is_isogram is not defined附加,因为您没有在测试文件中导入代码。您必须执行from mycode import is_isogram才能在代码中使用测试用例。如果你没有告诉他,你的测试不知道你的功能在哪里。

另一点,你的函数is_isogram没有做你想要她做的事情,请在你的代码中看到我的评论:

def is_isogram(word):
    if type(word)== str:
        for i in word:  # You did a loop here, but...
               # You go out this loop at the first iteration!
            if word.count(i) >1 or word == "":  # Here
                return (word, False)
            else:
                return (word, True)  # Or here
    # You only test the first letter in your word.. You have to move the 
    # return (word, True) outside the loop
    else:
        raise TypeError ("'{}' should be a string" .format(word))

您的测试用例有效,因为字母为2'a',而'a'位于第一位。但是如果你尝试'课程',你的测试将返回True,而不应该。

解决方案可能是:

def is_isogram(word):
    if type(word) is str:
        for i in word: 
            if word.count(i) > 1:
                return (word, False)
        return (word, True)
    else:
        raise TypeError("'{}' should be a string" .format(word))

答案 1 :(得分:0)

我觉得你应该做一个word.strip()==""以确保条件总是检查空字符串。我认为你的代码应该在那之后工作。

答案 2 :(得分:0)

首先,确保您的函数与测试文件位于同一文件中(在测试类之前)或从另一个文件导入。这样,您就不会出现 NameError 错误。 然后,尝试运行测试并发布您可能遇到的任何进一步的错误或问题。