基础入门_Python-内建函数.运维开发中eval内建函数的最佳实践?
生活随笔
收集整理的這篇文章主要介紹了
基础入门_Python-内建函数.运维开发中eval内建函数的最佳实践?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡單介紹:
說明: 在指定命名空間中計(jì)算參數(shù)字符串的有效表達(dá)式,并返回一個(gè)對象,
Help?on?built-in?function?eval?in?module?__builtin__:eval(...)eval(source[,?globals[,?locals]])?->?valueEvaluate?the?source?in?the?context?of?globals?and?locals.The?source?may?be?a?string?representing?a?Python?expressionor?a?code?object?as?returned?by?compile().The?globals?must?be?a?dictionary?and?locals?can?be?any?mapping,defaulting?to?the?current?globals?and?locals.If?only?globals?is?given,?locals?defaults?to?it.技巧: eval很危險(xiǎn),因?yàn)樗J(rèn)在當(dāng)前命名空間中解析語句表達(dá)式,但它支持設(shè)定命名空間防止當(dāng)前命名空間被污染,可以有效防止注入
最佳實(shí)踐:
#!/usr/bin/env?python #?-*-?coding:?utf-8?-*- """ # #?Authors:?limanman #?OsChina:?http://xmdevops.blog.51cto.com/ #?Purpose: # """ #?說明:?兼容絕對導(dǎo)入 from?__future__?import?absolute_import #?說明:?導(dǎo)入公共模塊 import?time import?operator #?說明:?導(dǎo)入其它模塊 from?.alarm?import?alarm_template from?.alarm.api?import?weixin_notifydef?avg(alarmtmplist,?redis_key,?trigg_key,?trigg_val,?errors):scope?=?{}realdata_lst?=?[](service_name,?converts_val,?during_time,?_,?operator_val,compare_time,?warnning_val,?critical_val)?=?trigg_valconvertsfunc?=?eval(converts_val,?scope)warnning_val?=?convertsfunc(warnning_val)critical_val?=?convertsfunc(critical_val)datacate,?host,?plugin?=?redis_key.split('::')operatorfunc?=?getattr(operator,?operator_val)for?cur_item?in?alarmtmplist:cur_item?=?convertsfunc(cur_item['data']['target'])realdata_lst.append(cur_item)avg_realdata?=?sum(realdata_lst)/len(realdata_lst)warnning_res?=?operatorfunc(avg_realdata,?warnning_val)critical_res?=?operatorfunc(avg_realdata,?critical_val)msgtime?=?time.strftime('%H:%M:%S',?time.localtime())formats?=?'PLUGIN(%s)?DURINGTIME(%s)?COMPARETIMES(%s)?AVG(%s)?OPERATION(%s)?TARGET(%s)'if?critical_res:message?=?formats?%?(plugin,?during_time,?compare_time,?avg_realdata,?operator_val,?critical_val)res_msg?=?alarm_template?%?(host,?'critical',?errors,?msgtime,?message)weixin_notify(res_msg)returnif?warnning_res:message?=?formats?%?(plugin,?during_time,?compare_time,?avg_realdata,?operator_val,?warnning_val)res_msg?=?alarm_template?%?(host,?'warnning',?errors,??msgtime,?message)weixin_notify(res_msg)return說明: 此文件本是預(yù)警系統(tǒng)閥值處理接口文件,傳遞過來的參數(shù)converts_val可能為str/int/float等類型名稱,都屬于內(nèi)置函數(shù)名,為了不污染當(dāng)前線程運(yùn)行環(huán)境同名內(nèi)置函數(shù),定義一個(gè)空scope,搜索時(shí)就在scope的__builtins__中調(diào)用純凈的str/int/float等內(nèi)置函數(shù),如果不定義,線程下次運(yùn)行時(shí)可能就找不到str/int/float等內(nèi)置函數(shù).
轉(zhuǎn)載于:https://blog.51cto.com/xmdevops/1860640
總結(jié)
以上是生活随笔為你收集整理的基础入门_Python-内建函数.运维开发中eval内建函数的最佳实践?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划——矩阵中的最短路径长度
- 下一篇: [Leetcode][第40题][JAV