开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 0

source-code-analysis/python3.8.1

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
python3.8.1
/
Doc
/
library
/
contextvars.rst
python3.8.1
/
Doc
/
library
/
contextvars.rst
contextvars.rst 8.10 KB
一键复制 编辑 原始数据 按行查看 历史
zhangweibo 提交于 2021年11月16日 09:46 +08:00 . git init

:mod:`contextvars` --- Context Variables

.. module:: contextvars
 :synopsis: Context Variables

.. sectionauthor:: Yury Selivanov <yury@magic.io>


This module provides APIs to manage, store, and access context-local state. The :class:`~contextvars.ContextVar` class is used to declare and work with Context Variables. The :func:`~contextvars.copy_context` function and the :class:`~contextvars.Context` class should be used to manage the current context in asynchronous frameworks.

Context managers that have state should use Context Variables instead of :func:`threading.local()` to prevent their state from bleeding to other code unexpectedly, when used in concurrent code.

See also Context Variables

Token objects are returned by the :meth:`ContextVar.set` method. They can be passed to the :meth:`ContextVar.reset` method to revert the value of the variable to what it was before the corresponding set.

.. attribute:: Token.var

 A read-only property. Points to the :class:`ContextVar` object
 that created the token.

.. attribute:: Token.old_value

 A read-only property. Set to the value the variable had before
 the :meth:`ContextVar.set` method call that created the token.
 It points to :attr:`Token.MISSING` is the variable was not set
 before the call.

.. attribute:: Token.MISSING

 A marker object used by :attr:`Token.old_value`.

Manual Context Management

.. function:: copy_context()

 Returns a copy of the current :class:`~contextvars.Context` object.

 The following snippet gets a copy of the current context and prints
 all variables and their values that are set in it::

 ctx: Context = copy_context()
 print(list(ctx.items()))

 The function has an O(1) complexity, i.e. works equally fast for
 contexts with a few context variables and for contexts that have
 a lot of them.


A mapping of :class:`ContextVars <ContextVar>` to their values.

Context() creates an empty context with no values in it. To get a copy of the current context use the :func:`~contextvars.copy_context` function.

Context implements the :class:`collections.abc.Mapping` interface.

.. method:: run(callable, \*args, \*\*kwargs)

 Execute ``callable(*args, **kwargs)`` code in the context object
 the *run* method is called on. Return the result of the execution
 or propagate an exception if one occurred.

 Any changes to any context variables that *callable* makes will
 be contained in the context object::

 var = ContextVar('var')
 var.set('spam')

 def main():
 # 'var' was set to 'spam' before
 # calling 'copy_context()' and 'ctx.run(main)', so:
 # var.get() == ctx[var] == 'spam'

 var.set('ham')

 # Now, after setting 'var' to 'ham':
 # var.get() == ctx[var] == 'ham'

 ctx = copy_context()

 # Any changes that the 'main' function makes to 'var'
 # will be contained in 'ctx'.
 ctx.run(main)

 # The 'main()' function was run in the 'ctx' context,
 # so changes to 'var' are contained in it:
 # ctx[var] == 'ham'

 # However, outside of 'ctx', 'var' is still set to 'spam':
 # var.get() == 'spam'

 The method raises a :exc:`RuntimeError` when called on the same
 context object from more than one OS thread, or when called
 recursively.

.. method:: copy()

 Return a shallow copy of the context object.

.. describe:: var in context

 Return ``True`` if the *context* has a value for *var* set;
 return ``False`` otherwise.

.. describe:: context[var]

 Return the value of the *var* :class:`ContextVar` variable.
 If the variable is not set in the context object, a
 :exc:`KeyError` is raised.

.. method:: get(var, [default])

 Return the value for *var* if *var* has the value in the context
 object. Return *default* otherwise. If *default* is not given,
 return ``None``.

.. describe:: iter(context)

 Return an iterator over the variables stored in the context
 object.

.. describe:: len(proxy)

 Return the number of variables set in the context object.

.. method:: keys()

 Return a list of all variables in the context object.

.. method:: values()

 Return a list of all variables' values in the context object.


.. method:: items()

 Return a list of 2-tuples containing all variables and their
 values in the context object.

asyncio support

Context variables are natively supported in :mod:`asyncio` and are ready to be used without any extra configuration. For example, here is a simple echo server, that uses a context variable to make the address of a remote client available in the Task that handles that client:

import asyncio
import contextvars

client_addr_var = contextvars.ContextVar('client_addr')

def render_goodbye():
 # The address of the currently handled client can be accessed
 # without passing it explicitly to this function.

 client_addr = client_addr_var.get()
 return f'Good bye, client @ {client_addr}\n'.encode()

async def handle_request(reader, writer):
 addr = writer.transport.get_extra_info('socket').getpeername()
 client_addr_var.set(addr)

 # In any code that we call is now possible to get
 # client's address by calling 'client_addr_var.get()'.

 while True:
 line = await reader.readline()
 print(line)
 if not line.strip():
 break
 writer.write(line)

 writer.write(render_goodbye())
 writer.close()

async def main():
 srv = await asyncio.start_server(
 handle_request, '127.0.0.1', 8081)

 async with srv:
 await srv.serve_forever()

asyncio.run(main())

# To test it you can use telnet:
# telnet 127.0.0.1 8081
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/python_sourcecode/python3.8.1.git
git@gitee.com:python_sourcecode/python3.8.1.git
python_sourcecode
python3.8.1
python3.8.1
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /