我是靠谱客的博主 端庄秋天,最近开发中收集的这篇文章主要介绍eval内建函数的最佳实践,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

简单介绍:

说明: 在指定命名空间中计算参数字符串的有效表达式,并返回一个对象,

1

2

3

4

5

6

7

8

9

10

11

Help on built-in function eval in module __builtin__:

 

eval(...)

    eval(source[, globals[, locals]]) -> value

     

    Evaluate the source in the context of globals and locals.

    The source may be a string representing a Python expression

    or 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很危险,因为它默认在当前命名空间中解析语句表达式,但它支持设定命名空间防止当前命名空间被污染,可以有效防止注入

 

最佳实践:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

#

# Authors: limanman

# OsChina: http://xmdevops.blog.51cto.com/

# Purpose:

#

"""

# 说明: 兼容绝对导入

from __future__ import absolute_import

# 说明: 导入公共模块

import time

import operator

# 说明: 导入其它模块

from .alarm import alarm_template

from .alarm.api import weixin_notify

 

 

def 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_val

    convertsfunc = 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)

        return

    if 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

说明: 此文件本是预警系统阀值处理接口文件,传递过来的参数converts_val可能为str/int/float等类型名称,都属于内置函数名,为了不污染当前线程运行环境同名内置函数,定义一个空scope,搜索时就在scope的__builtins__中调用纯净的str/int/float等内置函数,如果不定义,线程下次运行时可能就找不到str/int/float等内置函数.

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

本文出自 “满满李 - 运维开发之路” 博客,请务必保留此出处http://xmdevops.blog.51cto.com/11144840/1860640

转载于:https://my.oschina.net/learnbo/blog/846902

最后

以上就是端庄秋天为你收集整理的eval内建函数的最佳实践的全部内容,希望文章能够帮你解决eval内建函数的最佳实践所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部