Python 在if/elif语句中不起作用的列表和词汇

Python 在if/elif语句中不起作用的列表和词汇,python,list,function,if-statement,dictionary,Python,List,Function,If Statement,Dictionary,代码如下: def resetInv(inventory): if type(inventory) == list: inventory=[] return(inventory) elif type(inventory) == dict: return({}) elif type(inventory) == str: return('nothing in inventory') elif type(i

代码如下:

def resetInv(inventory):
    if type(inventory) == list:
        inventory=[]
        return(inventory)
    elif type(inventory) == dict:
        return({})
    elif type(inventory) == str:
        return('nothing in inventory')
    elif type(inventory) == bool:
        return(False)
    else:
        return('not inventory type')
它适用于str和bool,但不适用于列表和字典。

一些提示:

  • PEP8建议函数使用不带边框的_名称(而不是camelCaseNames)
  • 不要使用类型,如果必须检查类型,请使用
    isinstance
    功能
  • 在Python中,检查类型通常是一种代码气味——使用duck类型或更改算法
这对我很有用:

>>> def reset_inv(inventory):
    if isinstance(inventory, list):
        return []
    elif isinstance(inventory, dict):
        return {}
    elif isinstance(inventory, str):
        return 'nothing in inventory'
    elif isinstance(inventory, bool):
        return False
    else:
        return 'not inventory type'


>>> reset_inv([1, 2, 3])
[]

>>> reset_inv({"a": 1})
{}

>>> reset_inv("foo")
'nothing in inventory'

>>> reset_inv(True)
False

>>> reset_inv(0.1)
'not inventory type'
编写清单系统的惯用方法可能是使用简单的列表或dict作为对象的容器。下面我使用的是字符串,但您可能应该为库存项目编写一个类,该类具有值、重量等属性

>>> from collections import Counter

>>> class Inventory(object):
    def __init__(self, items = None):
        if items is None:
            self.reset()
        else:
            self.items = items

    def reset(self):
        self.items = []

    def report(self):
        if not self.items:
            print("Your sac is empty.")
            return

        print("You have {} items in your sac.".format(len(self.items)))
        counter = Counter(self.items).items()
        for count, item in counter:
            print("{: >3} {}".format(item, count))


>>> inv = Inventory(['knife', 'rock', 'rock', 'cloth'])

>>> inv.report()
You have 4 items in your sac.
  1 cloth
  1 knife
  2 rock

>>> inv.items.append('coin')

>>> inv.report()
You have 5 items in your sac.
  1 cloth
  1 coin
  1 knife
  2 rock

>>> inv.items.remove('rock')

>>> inv.report()
You have 4 items in your sac.
  1 cloth
  1 coin
  1 knife
  1 rock

>>> inv.reset()

>>> inv.report()
Your sac is empty.

你想通过这个来实现什么?非Pythonic中的代码是极端的。当dict和bool暗示您想要返回一个“空”对象时,为什么要将字符串
none
添加到列表和字符串中?我正在尝试实现一个函数来重置玩家的库存,例如,如果他们死亡并丢失了所有物品。这是为了测试,我想知道这是否是问题所在,一定是忘了把它解决掉了。对不起,什么是“库存”?这不可能是同时发生的所有事情。@BurhanKhalid:我可能太愚蠢了,无法理解这个笑话。谢谢,这很有帮助。我不能百分之百地理解它,但我知道如何使用它,这是最重要的。