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后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望最终匹配到”\”,就要反转义两次,也即由”\”到”\\”再到”\\\\”。

Hello world

你好世界!

こんにちは世界

Ciao mondo

Привет мир

Bonjour le monde

안녕 세상

Hallo Welt

Olá mundo

Hola Mundo

Γειά σου Κόσμε

Salut Lume

สวัสดีชาวโลก

Hej världen

salve mundi

Hai dunia

 

神毁灭了一座巴别塔,也许我们可以用计算机再建造一座。

God destroyed the Tower of Babel. Maybe we can build another one with the computer.