python 使用函数名的字符串调用函数(4种方法)

先看一个例子:

我们希望遍历执行列表中的函数,但是从列表中获得的函数名是字符串,所以会提示类型错误,字符串对象是不可以调用的。如果我们想要字符串变成可调用的对象呢?或是想通过变量调用模块的属性和类的属性呢?以下有三种方法可以实现。

eval()

eval() 通常用来执行一个字符串表达式,并返回表达式的值。在这里它将字符串转换成对应的函数。eval() 功能强大但是比较危险(eval is evil),不建议使用。

locals()和globals()

locals() 和 globals() 是python的两个内置函数,通过它们可以一字典的方式访问局部和全局变量。

getattr()

getattr() 是 python 的内建函数,getattr(object,name) 就相当于 object.name,但是这里 name 可以为变量。

返回 foo 模块的 bar 方法

返回 Foo 类的属性

标准库operator下的methodcaller函数

参考

Calling a function of a module from a string with the function’s name in Python

How do I use strings to call functions/methods?

https://blog.csdn.net/u013679490/article/details/54767170

SQLAlchemy 执行语句的打印

最近需要分析业务代码中MySQL语句执行效率,对于直接显示执行SQL语句的地方,可以直接将SQL语句和参数拼接后的结果打印出来,但是对于用SQLAlchemy Query查询的地方,就需要想办法打印出最后实际执行的语句。找了下各种方案,最后结果如下:

方式一:

SQLAlchemy支持在创建数据库引擎时,通过echo=true,将连接这个数据库引擎的所有执行语句打印出来:

官网说明: http://docs.sqlalchemy.org/en/latest/core/engines.html?highlight=echo#sqlalchemy.create_engine.params.echo

这种方式会自动将连接数据库过程中的所有类型语句,以及这些语句的参数列表打印出来。也即是说,这种方式打印出的语句和语句中的参数是分离的。

方式二:

对于某一个像上边这样的查询或插入语句,可以直接通过下边的方式,打印出不包含参数的SQL语句

这种方式得到的SQL也不可直接执行,因为对应的参数变量没有被替换

方式三

这种方式可以打印包含参数的执行语句,但是参数只包括数字和字符串等基本类型。其中dialects表示需要的数据库方言,我这里用的mysql。

基于方式三,增加部分代码,来打印datetime等类型的参数。

上边的代码支持 SQA 1.0.13及以上版本,支持select、insert和update命令。对其他版本的情况,可以参考

https://stackoverflow.com/questions/30992092/sqlalchemy-how-to-get-raw-sql-from-insert-update-statements-with-binded-p

参考:

http://stackoverflow.com/questions/5631078/sqlalchemy-print-the-actual-query

https://gist.github.com/gsakkis/4572159

grep -c 统计文件中字符串出现的行数

分析日志时,有时会需要统计某个方法出现的次数,这时就要用到grep -c,如下命令

grep -c  key_word  file1 file2 file3

返回

file1:count1

file2:count2

file3:count3

即依次返回每个文件中key_word出现的行数

与之类似的

grep key_word  file1 file2 file3 |wc -l

返回

count1 + count2 + count3

即返回的是多个文件中key_word出现的总行数

注意是行数不是次数,比如一个文件中只有一行,即使要查询的字符串出现了很多次,也只会打印1

Mysql like查询语句中,结果包含反斜杠 \ 字符的,需要替换成四个反斜杠 \\\\

    如题,当SQL语句中使用Like查询,且期望匹配的结果中含有”\”的,应当把”\”替换为”\\\\”。

    比如数据库中text字段有以下三行:

当我们使用下面这三种方式查询时,都会得到id 为1,2,3三行,原因后面会讲。

只有像下面这样使用四个反斜杠”\\\\”查询时,才会得到期望的包含”\24″的结果(id为2、3的两行)。

进一步,如果期望查询到的结果更准确,比如只得到id为2的第二行,应该像下边这样查询。

同理,只得到id为3的第三行,匹配两个反斜杠”\\”,应该使用八个反斜杠”\\\\\\\\”:

原因其实很简单,在mysql中,反斜杠在字符串中是转义字符,在进行语法解析时会进行一次转义,所以当我们在insert字符时,insert “\\” 在数据库中最终只会存储”\”。而在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望最终匹配到”\”,就要反转义两次,也即由”\”到”\\”再到”\\\\”。