Python中实现输入超时及如何通过变量获取变量名

Python中实现输入超时及如何通过变量获取变量名,第1张

概述Python中实现输入超时及如何通过变量获取变量名 背景介绍 开发中遇到了一个需求:程序运行到某处时需要用户确认, 但不能一直傻等, 后面的程序不能被一直阻塞, 需要有个超时限制, 也就是这个程序如果在一段时间后还没有得到用户输入就执行默认 *** 作. 解决思路 – 多线程法 我就想到了用多线程的方式, 开启一个子线程用stdin(比如python的input函数)获取用户输入, 主线程里设置线程启动和超时. 创建线程 Python中使用多线程很方便, threading.Threaded(函数, 参数表)然后thread.start就好了. 只是有一

背景介绍

开发中遇到了一个需求:程序运行到某处时需要用户确认,但不能一直傻等,后面的程序不能被一直阻塞,需要有个超时限制,也就是这个程序如果在一段时间后还没有得到用户输入就执行默认 *** 作.

解决思路 – 多线程法

我就想到了用多线程的方式,开启一个子线程用stdin(比如python的input函数)获取用户输入,主线程里设置线程启动和超时.

创建线程

Python中使用多线程很方便,threading.Threaded(函数,参数表)然后thread.start就好了. 只是有一点需要注意,上面参数表必须是个元组,也就是每个元素后面必须跟个逗号.

import threadingdef anyFunction(aaa): return str(aaa) #某种处理结果,比如字符串def manualinput(xxx): data = input("请输入%s: " % xxx) pass # 各种处理(比如数据转换什么的)exampleThread = threading.Thread(target = manualinput,args = ( anyFunction("汪汪汪"),),name = "喵喵喵")exampleThread.start()

通过函数修改某个指定的(通过名字即字符串)变量的值
但这又出来一个问题,如果不能使用全局变量,该如何在另一个函数里修改其参数对应的内容呢? 这里的重点归结起来是"函数如何修改自身参数的内容".

于是我想到了一个骚透了的方法——改变量字典…… 因为python的变量是基于标签的. python中的变量大致可以理解成给内容贴上标签(每个标签对应一个变量名,多个标签可能会引用同一个内容,没被引用的内容就会被python释放),每个标签都会有一个ID(同时,一个内存数据只要被引用那么自身也有个ID). 示例:

print(ID("喵喵喵"),"~~",ID("喵喵喵"),"~~")[Out]:1392371317520 ~~ 1392371317520 ~~ 1392371317520 ~~print(ID("喵喵喵")); print(ID("喵喵喵")); print(ID("喵喵喵"))[Out]:139237131857613923713180001392371318288

python维护这些标签和内容的对应关系可以通过字典的方式来读取和修改,改globals()[待改的变量的原名]的值就能通过指定变量名来修改变量了.

通过globals的字典修改变量

通过变量来获取变量的名字(字符串)
上面通过globals()[待改的变量的原名] = 新的内容的方式实现了修改变量的内容,可是,待改的变量的原名是个字符串,怎么通过变量得到这个变量的名字呢?

一个思路是字典法.

把当前运行环境中的所有变量复制一份(浅拷贝和深拷贝效果都一样,因为深浅拷贝前后都是相同的标签),然后新建一个"标签ID-变量名"的对照表字典,利用字典赋值的特性,遍历复制来的全局变量,把ID(变量值)作为key而变量名作为value,即标签ID-变量名字典[ID(变量值)] = 变量名.

test = "some values"变量A = "汪汪汪"当前所有变量 = globals().copy()print(当前所有变量)[Out]:{'__name__': '__main__',...,'test': 'some values','变量A': '汪汪汪'}内容_变量名字符串对照表 = {}for 变量名,变量值 in 当前所有变量.items(): 内容_变量名字符串对照表[ID(变量值)] = 变量名print(内容_变量名字符串对照表)[Out]:{2437914516272: '__name__',2437948462576: 'test',2437948432816:'变量A'}

这样一来就建立一个内容-变量名字符串的对照表,又因为ID(变量A) 和 ID(变量A的值)是相等,利用这个特性就能通过变量来取变量值了.

变量A的值 = 变量Aprint(ID(变量A的值)[Out]:2437948432816内容_变量名字符串对照表[ID(变量A的值)][Out]:'变量A'

通过函数修改变量

上面这一堆头发就是为了动态、通用地修改变量,封装成函数就能在任何地方调用和修改了.

def 一个实现变量修改函数(要改的变量,提示语): 当前所有变量 = globals().copy() 变量ID表 = {} for 变量名,变量值 in 当前所有变量.items():  变量ID表[ID(变量值)] = 变量名 待改的变量的原名 = 变量ID表[ID(要改的变量)] 新的内容 = str(input(提示语)) if len(新的内容) > 0 :  globals()[待改的变量的原名] = 新的内容 return 待改的变量的原名tmp = "汪汪汪"

一个实现变量修改函数(tmp,"请输入新值: ")

[Out]:请输入新值: 喵喵喵 'tmp'print(tmp)[Out]:喵喵喵

总结(demo)[不想看中间过程的话可以直接看这]

import time,threading# 这里的demo是为了通用化. 因为在一个线程中再嵌套另个线程的话,嵌套的线程获取不到所有变量class ThreaDWithReturn(threading.Thread): def __init__( self,target = None,args = () ):  super(ThreaDWithReturn,self).__init__()  self.func = target  self.args = args def run(self):  self.result = self.func(*self.args) def getResult(self):  try:   return self.result  except Exception as errInfo:   print("遇到错误: ",errInfo)   return Nonedef 一个实现变量修改函数(要改的变量,变量值 in 当前所有变量.items():  变量ID表[ID(变量值)] = 变量名 try:  待改的变量的原名 = 变量ID表[ID(要改的变量)] except KeyError:  print("***deBUG: 在不同的线程中运行,获取不到出入变量的名字")  待改的变量的原名 = None 新的内容 = str(input(提示语)) if len(新的内容) > 0 :  if 待改的变量的原名 != None:   globals()[待改的变量的原名] = 新的内容 else:  新的内容 = None return [待改的变量的原名,新的内容]def Gexit(): exitConfirm = "u" waitForConirm = ThreaDWithReturn( target = 一个实现变量修改函数,args = (exitConfirm,"收到了退出信号,默认30秒后退出,是否现在退出呢? (Y/n) 请输入: ",) ) waitForConirm.start() waitForConirm.join(30) try:  exitConfirm = waitForConirm.getResult()[1]  print("***deBUG,got:",exitConfirm) except Exception as errInfo:  print("***deBUG:",errInfo)  exitConfirm = "u" if exitConfirm == "u":  print("等待超时,开始退出流程...")  exitConfirm = "Ytt" if exitConfirm == "Ytt" or exitConfirm == "Y":  if exitConfirm == "Y":   print("确认退出,开始退出流程...")   pass # 这里放程序退出逻辑 if exitConfirm == "n":  print("取消退出,继续运行...")  pass # 这里放继续运行的逻辑 return 0Thread_waitForExit = threading.Thread(target = Gexit,args = ())Thread_waitForExit.start()Thread_waitForExit.join(45)

总结

以上所述是小编给大家介绍的Python中实现输入超时及如何通过变量获取变量的名字,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

总结

以上是内存溢出为你收集整理的Python中实现输入超时及如何通过变量获取变量名全部内容,希望文章能够帮你解决Python中实现输入超时及如何通过变量获取变量名所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1199406.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存