当前位置: 首页 > 面试题库 >

具有一些强制键作为功能输入的字典

孙朝明
2023-03-14
问题内容

我有一个以字典为参数的函数。我将传递给各种字典的字典,这些字典比函数内部使用的字典要多。另外,我想在函数定义中查看需要哪些键。所以我写

def fun(indict=dict(apple=None, pear=None)):

但是,该函数现在接受任何输入为indict。有没有聪明的写作方法

any dictionary that has at least the keys 'apple' and 'pear' is accepted.

就像是

def fun(indict=dict(apple=NeedsToBeSpecified, pear=NeedsToBeSpecified)):

问题答案:

在python3.x中,您可以使用函数注释:

>>> def foo(indict: dict(apple=None, pear=None)):
...     print(indict)
... 
>>> foo(dict())
{}

您甚至可以疯狂地使用现在被口译人员接受的Ellipsis文字

>>> def foo(indict: dict(apple=None, pear=None, extra_items=...)) -> int:
...     if any(x not in indict for x in ('apple', 'pear')):
...         raise ValueError('message here...')
...     print(indict)
...     return 3
... 
>>> foo({})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in foo
ValueError: message here...
>>> foo({'apple':6, 'pear':4})
{'pear': 4, 'apple': 6}
3
>>> foo({'apple':6, 'pear':4, 'carrot':30000})
{'carrot': 30000, 'pear': 4, 'apple': 6}
3

你可以从我的第一个例子中看到,注释不 执行
任何东西。您必须在函数本身中执行验证,尽管我想您可以从注解1中检查所需的键,如果您想使其保持DRY,但是仅使用2个键可能就不值得了……

在python2.x中(以及更传统的情况下),也许您只想将信息放入文档字符串中;-)-我也建议您对python3.x进行此操作,因为这是查找的传统位置用于文档…

1个keys = foo.__annotations__['indict'].keys() - {'extra_items'}

更新
请注意,现在像mypy这样的奇特事物闲坐着,这个答案可能有些过时了。您可以考虑使用TypedDictfrom进行注释mypy_extensions。如果您使用类似类型的检查器,那应该为您的用户设定期望,甚至可能帮助捕获一些错误mypy

from mypy_extensions import TypedDict

class Apple:
    """Represent an Apple."""

class Pear:
    """Represent a Pear."""

# "annotation-type" for a dictionary that has an apple and pear key whose values are Apple and Pear instances.
FruitBowl = TypedDict("FruitBowl": {"apple": Apple, "Pear": Pear})

def foo(indict: FruitBowl) -> int:
    ...


 类似资料:
  • 我对Kafka流很陌生,遇到了一个问题。 我有两个表 - 一个用于长期数据(描述),另一个用于实时数据(实时)。他们有一个共同的ID。 这个想法是存储来自描述的数据(假设在KTable中,为每个id保存最新的描述),当新消息出现在live - join中时,使用来自相应id上的描述的数据,并进一步发送它。 为简单起见,我们只使所有类型都为 String。 所以基本的想法就像我看过的所有教程一样:

  • 问题内容: 我需要编写一个接受某种输入流内容(例如InputStream或FileChannel)的函数,以便分两次读取大文件:一次是预先计算一些容量,第二次是进行“实际”工作。我不希望将整个文件立即加载到内存中(除非文件很小)。 是否有适当的Java类提供此功能? FileInputStream本身不支持mark()/ reset()。我认为BufferedInputStream确实可以,但是我

  • 问题内容: 我想创建JTextField,输入字符限于“ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYWZZ0123456789 +&@#/%?=〜_- |!:,。;”之类的输入字符。所以我尝试覆盖 但这不是我想要的,因为用户无法再按ctrl-c ctrl-v ctrl-x …所以我添加了 到if条件,但现在用户可以粘贴不适当的输入,即’(’

  • 问题内容: 我知道这并不是问问题的正确方法,但是我遇到了问题: 我有一个本地存储的wsdl,我需要创建一个Web服务客户端来调用该Web服务。问题是服务位于防火墙后面,我必须通过代理连接到它,然后我必须进行身份验证才能连接到WS。 我所做的是使用Apache CXF 2.4.6生成WS Client,然后设置系统范围的代理 我知道这不是最佳做法,因此,请提出一个更好的解决方案,如果有人可以给我提示

  • 本文向大家介绍iOS 键盘输入限制(只能输入字母,数字,禁止输入特殊符号),包括了iOS 键盘输入限制(只能输入字母,数字,禁止输入特殊符号)的使用技巧和注意事项,需要的朋友参考一下 首先我们要设置一下键盘类型 textFiled.keyboardType = UIKeyboardTypeASCIICapable;  (根据个人喜好设置键盘) 然后我们要设置textfield的代理<UITextF

  • 我们想用雄辩的ORM和Laravel 5实现复合主键http://www.mbarendezvous.com/ 据我所知,它目前还没有得到雄辩者的支持。请建议最好的替代方案。