【问题标题】:How do I specify a dict dtat type in a python 3 parameter如何在 python 3 参数中指定 dict 数据类型
【发布时间】:2015-11-18 20:06:58
【问题描述】:

我正在尝试将 dict 变量传递给 Python 3 中的函数,然后尝试通过调用 .keys() 函数来遍历键。但是我不知道如何指定参数的类型。

def DisplayStock(StockDict):
    for key in StockDict.keys():

我得到的错误是

for key in StockDict.keys():
AttributeError: 'function' object has no attribute 'keys'

【问题讨论】:

  • 请详细说明,非常不清楚。你的意思是参数StockDict 的类型,这样你就知道它是一本字典?如果是这样,python 采用duck typing 的理念,参见here。因此,只要传递的对象支持适当的协议,就可以将其视为字典。请参阅here 并在 SO 和互联网上寻找其他类似的问答
  • 我正在传递一个字典。但是,我无法使用 .keys() 方法,因为解释器没有意识到它是一个 dict,它似乎正在抛出一个错误......至少我认为这是正在发生的事情!
  • “至少我认为是这样的!”你想什么是什么意思?如果你的代码没有运行,你应该会看到一个异常和堆栈跟踪,告诉你到底发生了什么。
  • 请显示StockDict类型:print(type(StockDict))

标签: python python-3.x dictionary


【解决方案1】:

我猜你问的是pep-484

def DisplayStock(StockDict: dict):
    for key in StockDict.keys()

StockDict是参数名,dict是参数类型。

【讨论】:

  • 我试过这个并没有得到任何改变。仍然给出了同样的错误信息。
  • @StuartMaher 类型注释实际上并没有被 Python 强制执行
【解决方案2】:

您似乎只是将错误传递给函数。从错误看来,您正在赋予它一个功能。也许您应该将() 放在导致错误的参数后面。

通常您不需要指定类型。该函数将采用任何类型。

如果你想检查传递的参数是否是一个字典,你可以使用:

if isinstance(Stockdict, dict):
     for key in Stockdict.keys()

虽然这不是很pythonic。只是不要将非 dict 之类的对象传递给函数。

【讨论】:

  • 请详细说明,这是一个很好的答案的机会,虽然它听起来像重复......
  • if isinstance(dict): 应该是if isinstance(StockDict, dict):
  • 我关心的不是运行时类型安全。该程序不会通过解释器。我已经编辑了原始问题以包含错误,因为这可能会说明问题(我应该从一开始就这样做,我很糟糕!)
【解决方案3】:

问题不在于参数类型。 Python 很高兴只是一个变量名和原始代码,然后使用 .keys 方法。错误出现在代码的不同部分,我在函数调用中错过了括号,并将我的字典对象设置为函数引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2011-04-14
    • 2019-11-04
    • 1970-01-01
    • 2023-03-04
    • 2011-11-26
    • 2012-05-13
    相关资源
    最近更新 更多