我正在努力寻找一个好的解决方案,而且没有任何想法。作为练习,我试图创建一个上下文管理器来处理数据验证,例如:
validation = lambda x: len(x) <= 10
with validator(validation):
some_data = input("Please enter a name of 10 characters or less: ")
print(some_data)
# OUTPUT
>> Please enter a name of 10 characters or less: FooBarSpamEggs
>> Please enter a name of 10 characters of less: Adam
Adam
最初,我考虑过使用此功能,unittest.mock.patch
但是我意识到,在修补原始函数时,我无法调用它,例如:
def patched(validation, *args):
while True:
p = __builtins__.input(args) # Doesn't work
if validation(p):
break
return p
with unittest.mock.patch('builtins.input', patched):
input("Some prompt here: ")
# fails on recursion error as patched calls itself
然后,我考虑编写一个装饰器来验证单行,但这仅在您可以执行以下操作时才有用:
@validate(lambda x: int(x) == 6)
p = input("How many sides does a d6 have? ")
# can't decorate a function call
但是,我对这种上下文管理器想法很挂念。不幸的是,我不知道上下文管理器是否有权访问其内容,或者是否仅限于其参数。有什么想法吗?
顺便说一句,我知道我可以在一个函数中呈现此功能,例如:
def validate_input(prompt, validation, msg_if_fail=None):
while True:
p = input(prompt)
if validation(p):
break
if msg_if_fail is not None:
print(msg_if_fail)
return p
但这不是那么漂亮。正如我所说,这是一项练习,而不是实际问题。
您可以使用常规的上下文管理器来包装unittest.mock.patch
,并在对原始input
函数进行修补之前保存对原始函数的引用。然后,您可以将原件传递input
给您的patched
函数:
import unittest.mock
import contextlib
from functools import partial
def patched(validation, orig_input, *args):
while True:
p = orig_input(*args)
if validation(p):
break
return p
@contextlib.contextmanager
def validator(validate_func):
func = partial(patched, validate_func, input) # original input reference saved here
patch = unittest.mock.patch('builtins.input', func)
patch.start()
try:
yield
finally:
patch.stop()
validation = lambda x: len(x) <= 10
然后,您可以像这样使用contextmanager:
with validator(validation):
x = input("10 or less: ")
x = input("10 or less (unpatched): ")
print("done")
样本输出:
10 or less: abcdefghijklmnop
10 or less: abcdefgdfgdgd
10 or less: abcdef
10 or less (unpatched): abcdefghijklmnop
done
要使人晓得智慧和训诲,分辨通达的言语。使人处事,领受智慧、仁义、公平、正直的训诲。使愚人灵明、使少年人有知识和谋略。使智慧人听见、增长学问、使聪明人得着智谋、使人明白箴言和譬喻、懂得智慧人的言词和谜语。敬畏耶和华使知识的开端,愚妄人藐视智慧和训诲。 上下文管理器 在《文件(1)》中提到,如果要打开文件,一种比较好的方法是使用with语句,因为这种方法,不仅结构简单,更重要的是不用再单独去判断某种异
Context managers for use with the with statement. 注解 When using Python 2.5, you will need to start your fabfile with from __future__ import with_statement in order to make use of the with statement (w
问题内容: 我有一个异步API,用于连接邮件并将其发送到SMTP服务器,该服务器具有一些设置并已删除。因此,它非常适合使用Python 3的。 虽然,我不知道是否可以写,因为它们都使用生成器语法来写。 这可能证明了这个问题(包含yield-base和async-await语法的混合,以演示异步调用和上下文管理器的yield之间的区别)。 目前在python中可能发生这种情况吗?以及如何使用该 语句
问题内容: 我不明白为什么无法在此示例中模拟NamedTemporaryFile.name: 测试结果在: 问题答案: 您设置的模拟错误:不是上下文管理器,而是 返回 了一个上下文管理器。将您的设置行替换为: 这样您的测试就可以了。
问题内容: 在这个问题中,我定义了一个包含上下文管理器的上下文管理器。完成此嵌套的最简单的正确方法是什么?我最后打电话了。但是,在中,我很确定我必须调用finally块,以防引发异常。如果出现问题,是否应该设置type_,value和traceback参数?我检查了,但找不到任何实用程序来帮助解决此问题。 来自问题的原始代码: 问题答案: 创建上下文管理器的简单方法是使用。像这样: 然后使用。语句
本文向大家介绍Python多个上下文管理器,包括了Python多个上下文管理器的使用技巧和注意事项,需要的朋友参考一下 示例 您可以同时打开多个内容管理器: 它与嵌套上下文管理器具有相同的效果: