首页 > 编程语言 >python3.6 使用调用栈储存上下文变量

python3.6 使用调用栈储存上下文变量

时间:2024-03-25 12:13:18浏览次数:27  
标签:__ set name get 0.1 python3.6 调用 上下文 def

python3.6 使用调用栈储存上下文变量

从 python3.7 开始, 新增 contextvars 模块, 用于储存上下文变量.

使用场景

# python3.7
from contextvars import ContextVar
import asyncio

user = ContextVar('var')


async def b():
    u = user.get()
    print(f'get name {u}')


async def a(name):
    user.set(name)
    print(f'set name {name}')
    await asyncio.sleep(0.1)
    print('after sleep 0.1s')
    await b()


async def main():
    await asyncio.gather(a('foo'), a('bar'))


if __name__ == "__main__":
    asyncio.run(main())

"""
# output:

set name foo
set name bar
after sleep 0.1s
get name foo
after sleep 0.1s
get name bar
"""

python3.6 实现相似功能

思路

  • 在一个函数中可以获取当前调用栈;
  • 从当前调用栈可以访问上一级调用栈;
  • 调用栈是一个 PyObject 对象, 可以动态添加数据;

实现

# python3.6
import asyncio

import inspect
import logging


def get_context(symbol):
    f = inspect.currentframe()
    while f:
        value = f.f_locals.get(symbol)
        if value:
            return value
        f = f.f_back
    return ''


def set_context(symbol, value, stack_deepth=1):
    f = inspect.currentframe()
    for _ in range(stack_deepth):
        f = f.f_back
    f.f_locals[symbol] = value


USER_SYMBOL = 'USER'


def get_user():
    return get_context(USER_SYMBOL)


def set_user(value, stack_deepth=1):
    return set_context(USER_SYMBOL, value, stack_deepth=stack_deepth+1)


async def b():
    u = get_user()
    print(f'get name {u}')


async def a(name):
    set_user(name)
    print(f'set name {name}')
    await asyncio.sleep(0.1)
    print('after sleep 0.1s')
    await b()


async def main():
    await asyncio.gather(a('foo'), a('bar'))


if __name__ == "__main__":
    l = asyncio.get_event_loop()
    l.run_until_complete(main())

"""
# output:

set name foo
set name bar
after sleep 0.1s
get name foo
after sleep 0.1s
get name bar
"""

标签:__,set,name,get,0.1,python3.6,调用,上下文,def
From: https://www.cnblogs.com/aloe-n/p/18094084

相关文章

  • 纯前端调用原生Office实现Web在线编辑Word/Excel/PPT,支持私有化部署
    在日常协同办公过程中,一份文件可能需要多次重复修改才能确定,如果你发送给多个人修改后再汇总,这样既效率低又容易出错,这就用到网页版协同办公软件了,不仅方便文件流转还保证不会出错。但是目前一些在线协同Office属于模拟Office,在线模拟OFFICE编辑过的文档,再用本机Office编辑都存在......
  • SpringCloud学习笔记二:服务间调用
    微服务中,很多服务系统都在独立的进程中运行,通过各个服务系统之间的协作来实现一个大项目的所有业务功能。服务系统间使用多种跨进程的方式进行通信协作,而RESTful风格的网络请求是最为常见的交互方式之一。springcloud提供的方式:1.RestTemplate2.Feign一、服务提供者创建......
  • C# 执行外部程序方法_可调用
    //新建一个cs文件,放在你的项目内,可以调用这个方法。usingSystem;usingSystem.Diagnostics;//调用程序namespaceShutdown{classProces{publicstaticvoidProgress(stringProce,stringParameter,uintX){Processp=......
  • Day 15(操作符)赋值+单目+关系+逻辑+条件+逗号表达式+下标引用+函数调用
    1.赋值操作符:=   复合赋值符:+=         -=       *=       /=     &=      |=     ^=       %=    >>=    <<=eg: a=a+2→a+=2  a=a>>1→a>>=1连续赋值:a=b=c(从右向左运行)(不推荐此方法)2......
  • c# 调用ImageMagick实现HEIC格式的图片转成jpg
    nuget安装Magick.NET-Q8-AnyCPU我项目Framework未4.5.1这安装的7.17.0版本的包:程序集引用:usingImageMagick;ConvertHeicToJpg方法转换代码如下:点击查看代码///<summary>///Heic转ToJpg///</summary>///<paramname="heicPath......
  • 银河麒麟系统V10上安装TTS语音模块,并使用C#调用进行语音播报
    银河麒麟系统V10上安装TTS语音模块,并使用C#调用进行语音播报系统版本什么是TTS需求背景环境部署更新系统安装版本包安装完成执行命令测试C#环境下调用语音播报系统版本什么是TTS从文本到语音TTS是“TextToSpeech”的缩写,即“从文本到语音”,是人......
  • [手游逆向]如何不完美调用void函数
    我们先看两个函数publicBooleanremoveMonster(Int32objSID,BooleanfireEvent,Booleancache){}publicVoidDestoryAllMonsters(){}一个是布尔值的,用来判断是否删除怪物(注:火影PVE中,怪物死亡时有删除动画)一个是void类型的,这是我们用来调用的对象接下来,我将会演示......
  • 如何用pytorch调用预训练Swin Transformer中的一个Swin block模块
    1,首先,我们需要知道的是,想要调用预训练的SwinTransformer模型,必须要安装pytorch2,因为pytorch1对应的torchvision中不包含SwinTransformer。2,pytorch2调用预训练模型时,不建议使用pretrained=True,这个用法即将淘汰,会报警告。最好用如下方式:fromtorchvision.models.swin_trans......
  • uniapp发布到h5调用Android原生拍照,相册,uniapp如何显示并上传
    先说一下我这边的需求:uniapp这边发布到h5,然后调用Android原生拍照,选择相册,最后将路径回调到uniapp,uniapp那边image要优先将图片回显出来,并将图片上传到服务器遇到的问题:1调用原生拍照,选择相册回调到uniapp,uniapp的image控件无法展示Android那边回调回来的图片路径,但是如......
  • python 函数(解包、互相调用、作用域、函数的封装、内置函数:eval()、zip()、open())
    函数解包"""1、函数的注释:参数和返回值在注释里可以自动添加显示,只需手动加说明。2、函数的解包【拆包】:函数的参数要传递数据有多个值的时候,中间步骤拿到数据保存在元组或者列表或者字典里。-传递参数的时候加一个*或者**解包-一次拿到元组列表字典的......