Python TypeError:“NoneType”类型的参数不可迭代

时间:2012-04-13 21:37:42

标签: python typeerror nonetype

因此,对于我的第一个大型python项目,我正在构建一个基于文本的游戏。它应该是模块化的,因此故事和项目等可以编辑和替换,只需对实际源代码进行少量编辑。基本上,用户命令存储为字符串,该字符串立即分成列表。第一个元素是类似'inspect'的动作,第二个元素是该动作的伪参数,如'location'或'item'。解释命令后,它会进入名为'item_or_loc'的执行模块。我在这里得到错误。有人可以帮忙吗?如果它有帮助,我会提供更多信息或整个源代码。

命令模块:

    def item_or_loc(iolo):
        if iolo in items.items_f():
            print (items.iolo(1))
        elif iolo in locations.locations_f():
            print (locations.iolo(1))
        else:
            print ('Command not recognized, try again.')


    def location(loco):
        plo_l = PlayerClass #(player location object_location)
        if loco == 'location':
            plo_l.player_loc(0)


    def abort(abo):
        sys.exit()


    def inventory(invo):
        pio_i = PlayerClass #(player inventory object_inventory)
        if invo == 'inventory':
            pio_i.player_inv(0)

项目模块:

    patient_gown=('Patient gown', 'A light blue patient\'s gown.')
    wrench=('Wrench','')
    stick=('Stick','')
    prybar=('Prybar','')
    screwdriver=('Screwdriver','')
    scalpel=('Scalpel','')
    broken_tile=('Broken tile','')
    hatchet=('Hatchet','')
    janitor_suit=('Janitor suit','')

位置模块:基本上与项目模块相同

播放器模块:

    import items
    import locations

    class PlayerClass:
        def player_inv(inv_index):
        pinventory = [items.patient_gown[inv_index]]
        print (pinventory)

    def player_loc(loc_index):
        ploc = [locations.cell[loc_index]]
        print (ploc)

1 个答案:

答案 0 :(得分:3)

您不会从items.items_f返回任何内容。您需要返回容器或序列。我会从下面提出一个不同的方法,但这至少是一个开始。

def items_f():
    patient_gown=('Patient gown','A light blue patient\'s gown.')
    wrench=('','')
    stick=('','')
    crowbar=('','')
    screwdriver=('','')
    scalpel=('','')
    broken_tile=('','')
    hatchet=('','')
    janitor_suit=('','')
    return (patient_gown, wrench, stick, crowbar, 
            screwdriver, scalpel, broken_tile, hatchet, janitor_suit)

要解释一下,items_f本身不是一个容器,而是一个函数(或者更确切地说,一个方法,你可以把它想象成一个“附加”到一个对象的函数)。函数 不返回任何内容,但是当您调用它们时,调用产生的值只是None

现在,当您执行if x in y:之类的测试时,y必须是序列或容器类型;并且由于您正在测试函数items_f的结果,并且由于该函数返回None,因为您已在上面定义它,因此测试会抛出错误。

处理这种情况的最佳方法实际上取决于程序的更大结构。正确方向的第一步可能是这样的:

def items_f():
    return (('Patient gown', 'A light blue patient\'s gown.'),
            ('Wrench', 'A crescent wrench.'),
            ('Stick', '...'))

但这也许不是最好的解决方案。我基于你上面添加的内容(顺便说一下,现在缺少items_f函数)的建议是使用某种保存项目的数据结构。一个简单的方法是字典:

items = {'patient_gown':('Patient gown', 'A light blue patient\'s gown.'),
         'wrench':('Wrench', '...'),
          ...
        }

这会创建一个包含所有可能项目的字典。现在,当你想要一个特定的项目时,你可以这样:

item = items['patient_gown']

这样你根本不需要一个功能;你可以直接访问整个字典。