最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中實(shí)現(xiàn)輸入超時(shí)及如何通過(guò)變量獲取變量名

 更新時(shí)間:2020年01月18日 11:18:46   作者:佚之狗  
這篇文章主要介紹了Python中實(shí)現(xiàn)輸入超時(shí)以及通過(guò)變量獲取變量的名字,本文給大家分享了解決思路主要是通過(guò)多線程法實(shí)現(xiàn),需要的朋友可以參考下

背景介紹

開發(fā)中遇到了一個(gè)需求:程序運(yùn)行到某處時(shí)需要用戶確認(rèn), 但不能一直傻等, 后面的程序不能被一直阻塞, 需要有個(gè)超時(shí)限制, 也就是這個(gè)程序如果在一段時(shí)間后還沒(méi)有得到用戶輸入就執(zhí)行默認(rèn)操作.

解決思路 – 多線程法

我就想到了用多線程的方式, 開啟一個(gè)子線程用stdin(比如python的input函數(shù))獲取用戶輸入, 主線程里設(shè)置線程啟動(dòng)和超時(shí).

創(chuàng)建線程

Python中使用多線程很方便, threading.Threaded(函數(shù), 參數(shù)表)然后thread.start就好了. 只是有一點(diǎn)需要注意, 上面參數(shù)表必須是個(gè)元組, 也就是每個(gè)元素后面必須跟個(gè)逗號(hào).

import threading
def anyFunction(aaa):
 return str(aaa) #某種處理結(jié)果, 比如字符串
def manualInput(xxx):
 data = input("請(qǐng)輸入%s: " % xxx)
 pass # 各種處理(比如數(shù)據(jù)轉(zhuǎn)換什么的)
 
exampleThread = threading.Thread(target = manualInput, args = ( anyFunction("汪汪汪"), ), name = "喵喵喵")
exampleThread.start()

通過(guò)函數(shù)修改某個(gè)指定的(通過(guò)名字即字符串)變量的值
但這又出來(lái)一個(gè)問(wèn)題, 如果不能使用全局變量, 該如何在另一個(gè)函數(shù)里修改其參數(shù)對(duì)應(yīng)的內(nèi)容呢? 這里的重點(diǎn)歸結(jié)起來(lái)是"函數(shù)如何修改自身參數(shù)的內(nèi)容".

于是我想到了一個(gè)騷透了的方法——改變量字典…… 因?yàn)閜ython的變量是基于標(biāo)簽的. python中的變量大致可以理解成給內(nèi)容貼上標(biāo)簽(每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)變量名, 多個(gè)標(biāo)簽可能會(huì)引用同一個(gè)內(nèi)容, 沒(méi)被引用的內(nèi)容就會(huì)被python釋放), 每個(gè)標(biāo)簽都會(huì)有一個(gè)id(同時(shí), 一個(gè)內(nèi)存數(shù)據(jù)只要被引用那么自身也有個(gè)id). 示例:

print(id("喵喵喵"),"~~", id("喵喵喵"),"~~", id("喵喵喵"),"~~")
[Out]: 
1392371317520 ~~ 1392371317520 ~~ 1392371317520 ~~
print(id("喵喵喵")); print(id("喵喵喵")); print(id("喵喵喵"))
[Out]: 
1392371318576
1392371318000
1392371318288

python維護(hù)這些標(biāo)簽和內(nèi)容的對(duì)應(yīng)關(guān)系可以通過(guò)字典的方式來(lái)讀取和修改, 改globals()[待改的變量的原名]的值就能通過(guò)指定變量名來(lái)修改變量了.

通過(guò)globals的字典修改變量

通過(guò)變量來(lái)獲取變量的名字(字符串)
上面通過(guò)globals()[待改的變量的原名] = 新的內(nèi)容的方式實(shí)現(xiàn)了修改變量的內(nèi)容, 可是, 待改的變量的原名是個(gè)字符串, 怎么通過(guò)變量得到這個(gè)變量的名字呢?

一個(gè)思路是字典法.

把當(dāng)前運(yùn)行環(huán)境中的所有變量復(fù)制一份(淺拷貝和深拷貝效果都一樣, 因?yàn)樯顪\拷貝前后都是相同的標(biāo)簽), 然后新建一個(gè)"標(biāo)簽id-變量名"的對(duì)照表字典, 利用字典賦值的特性, 遍歷復(fù)制來(lái)的全局變量, 把id(變量值)作為key而變量名作為value, 即標(biāo)簽id-變量名字典[id(變量值)] = 變量名.

test = "some values"   
變量A = "汪汪汪" 
當(dāng)前所有變量 = globals().copy()
print(當(dāng)前所有變量)

[Out]:
{'__name__': '__main__',..., 'test': 'some values', '變量A': '汪汪汪'}

內(nèi)容_變量名字符串對(duì)照表 = {} 
for 變量名, 變量值 in 當(dāng)前所有變量.items():
 內(nèi)容_變量名字符串對(duì)照表[id(變量值)] = 變量名
print(內(nèi)容_變量名字符串對(duì)照表)

[Out]:
{2437914516272: '__name__',..., 2437948462576: 'test', 2437948432816:'變量A'}

這樣一來(lái)就建立一個(gè)內(nèi)容-變量名字符串的對(duì)照表, 又因?yàn)閕d(變量A) 和 id(變量A的值)是相等, 利用這個(gè)特性就能通過(guò)變量來(lái)取變量值了.

變量A的值 = 變量A
print(id(變量A的值)
[Out]:
2437948432816
內(nèi)容_變量名字符串對(duì)照表[id(變量A的值)]
[Out]:
'變量A'

通過(guò)函數(shù)修改變量

上面這一堆頭發(fā)就是為了動(dòng)態(tài)、通用地修改變量, 封裝成函數(shù)就能在任何地方調(diào)用和修改了.

def 一個(gè)實(shí)現(xiàn)變量修改函數(shù)(要改的變量, 提示語(yǔ)):
 當(dāng)前所有變量 = globals().copy()
 變量id表 = {}
 for 變量名, 變量值 in 當(dāng)前所有變量.items():
  變量id表[id(變量值)] = 變量名
 待改的變量的原名 = 變量id表[id(要改的變量)]
 新的內(nèi)容 = str(input(提示語(yǔ)))
 if len(新的內(nèi)容) > 0 :
  globals()[待改的變量的原名] = 新的內(nèi)容
 return 待改的變量的原名
tmp = "汪汪汪"

一個(gè)實(shí)現(xiàn)變量修改函數(shù)(tmp, "請(qǐng)輸入新值: ")

[Out]:
請(qǐng)輸入新值: 喵喵喵
 'tmp'
print(tmp)
[Out]:
喵喵喵

總結(jié)(demo)[不想看中間過(guò)程的話可以直接看這]

import time, threading
# 這里的demo是為了通用化. 因?yàn)樵谝粋€(gè)線程中再嵌套另個(gè)線程的話, 嵌套的線程獲取不到所有變量
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("遇到錯(cuò)誤: ", errInfo)
   return None
def 一個(gè)實(shí)現(xiàn)變量修改函數(shù)(要改的變量, 提示語(yǔ)):
 當(dāng)前所有變量 = globals().copy()
 變量id表 = {}
 for 變量名, 變量值 in 當(dāng)前所有變量.items():
  變量id表[id(變量值)] = 變量名
 try:
  待改的變量的原名 = 變量id表[id(要改的變量)]
 except KeyError:
  print("***debug: 在不同的線程中運(yùn)行, 獲取不到出入變量的名字")
  待改的變量的原名 = None
 新的內(nèi)容 = str(input(提示語(yǔ)))
 if len(新的內(nèi)容) > 0 :
  if 待改的變量的原名 != None:
   globals()[待改的變量的原名] = 新的內(nèi)容
 else:
  新的內(nèi)容 = None
 return [待改的變量的原名, 新的內(nèi)容]
def Gexit():
 exitConfirm = "u"
 waitForConirm = ThreadWithReturn( target = 一個(gè)實(shí)現(xiàn)變量修改函數(shù), args = (exitConfirm, "收到了退出信號(hào), 默認(rèn)30秒后退出, 是否現(xiàn)在退出呢? (Y/n) 請(qǐng)輸入: ",) )
 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("等待超時(shí), 開始退出流程...")
  exitConfirm = "Ytt"
 if exitConfirm == "Ytt" or exitConfirm == "Y":
  if exitConfirm == "Y":
   print("確認(rèn)退出, 開始退出流程...")
   pass # 這里放程序退出邏輯
 if exitConfirm == "n":
  print("取消退出, 繼續(xù)運(yùn)行...")
  pass # 這里放繼續(xù)運(yùn)行的邏輯
 return 0
Thread_waitForExit = threading.Thread(target = Gexit, args = ())
Thread_waitForExit.start()
Thread_waitForExit.join(45)

總結(jié)

以上所述是小編給大家介紹的Python中實(shí)現(xiàn)輸入超時(shí)及如何通過(guò)變量獲取變量的名字,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • PyTorch加載預(yù)訓(xùn)練模型實(shí)例(pretrained)

    PyTorch加載預(yù)訓(xùn)練模型實(shí)例(pretrained)

    今天小編就為大家分享一篇PyTorch加載預(yù)訓(xùn)練模型實(shí)例(pretrained),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • windows系統(tǒng)下Python環(huán)境的搭建(Aptana Studio)

    windows系統(tǒng)下Python環(huán)境的搭建(Aptana Studio)

    這篇文章主要介紹了windows系統(tǒng)下Python環(huán)境的搭建(Aptana Studio),需要的朋友可以參考下
    2017-03-03
  • Python多叉樹的構(gòu)造及取出節(jié)點(diǎn)數(shù)據(jù)(treelib)的方法

    Python多叉樹的構(gòu)造及取出節(jié)點(diǎn)數(shù)據(jù)(treelib)的方法

    今天小編就為大家分享一篇Python多叉樹的構(gòu)造及取出節(jié)點(diǎn)數(shù)據(jù)(treelib)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python字典的常用操作方法小結(jié)

    python字典的常用操作方法小結(jié)

    下面小編就為大家?guī)?lái)一篇python字典的常用操作方法小結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • pytorch加載自己的數(shù)據(jù)集源碼分享

    pytorch加載自己的數(shù)據(jù)集源碼分享

    這篇文章主要介紹了pytorch加載自己的數(shù)據(jù)集源碼分享,標(biāo)準(zhǔn)的數(shù)據(jù)集流程梳理分為數(shù)據(jù)準(zhǔn)備以及加載數(shù)據(jù)庫(kù)–>數(shù)據(jù)加載器的調(diào)用或者設(shè)計(jì)–>批量調(diào)用進(jìn)行訓(xùn)練或者其他作用,需要的朋友可以參考下
    2022-08-08
  • Python openpyxl模塊學(xué)習(xí)之輕松玩轉(zhuǎn)Excel

    Python openpyxl模塊學(xué)習(xí)之輕松玩轉(zhuǎn)Excel

    Python提供了許多操作Excel的模塊,能夠讓我們從繁瑣的工作中騰出雙手。本文主要為大家介紹的是openpyxl模塊,它的功能相對(duì)與其他模塊更為齊全,感興趣的小伙伴快來(lái)學(xué)習(xí)一下吧
    2021-12-12
  • Python實(shí)現(xiàn)從腳本里運(yùn)行scrapy的方法

    Python實(shí)現(xiàn)從腳本里運(yùn)行scrapy的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)從腳本里運(yùn)行scrapy的方法,實(shí)例分析了Python腳本運(yùn)行的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • python判斷是否漢字的5種方法實(shí)例

    python判斷是否漢字的5種方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于python判斷是否漢字的5種方法,文中通過(guò)實(shí)例代碼將判斷的幾種方法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-06-06
  • PyTorch定義Tensor及索引和切片(最新推薦)

    PyTorch定義Tensor及索引和切片(最新推薦)

    這篇文章主要介紹了PyTorch定義Tensor以及索引和切片,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • python畫條形圖實(shí)例

    python畫條形圖實(shí)例

    這篇文章主要為大家詳細(xì)介紹了python畫條形圖實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評(píng)論

翼城县| 定陶县| 商洛市| 青川县| 台东市| 安福县| 赣州市| 乐清市| 谢通门县| 淮阳县| 金山区| 宣恩县| 义乌市| 荥阳市| 团风县| 抚远县| 那坡县| 汕尾市| 翁源县| 古交市| 聂拉木县| 磐安县| 奇台县| 永胜县| 郧西县| 甘泉县| 巴林左旗| 天水市| 吉林省| 嘉峪关市| 桑植县| 金秀| 涿州市| 兴安县| 沙河市| 弋阳县| 宝鸡市| 扎囊县| 高密市| 若尔盖县| 托克托县|