分类 python 下的文章

在aiohttp中踩到的一个坑

aiohttp的语法非常不好看,一层套一层,如果有多个请求,逻辑比较复杂,我就想把请求进行封装,比如我写了如下方法:

    async def send_request(self, method, url, **kwargs):
        kwargs.setdefault('allow_redirects', False)
        kwargs.setdefault('timeout', 5)
        async with self.session.request(method, url, **kwargs) as response:
            return response

然后我希望在任意地方调用await self.send_request('GET', 'https://www.leavesongs.com'),然后拿到response,进行后续的操作。

但是这里存在一个巨大的坑:由于存在async with语法,这一次请求将在with块中的内容执行完后自动关闭。如果我调用了如下代码:

response = await self.send_request('GET', 'https://www.leavesongs.com')
text = await response.text()

将可能会触发Connection closed错误(而且是一定几率触发),原因就是async with块在执行完成以后就关闭了连接,再调用text()方法就没意义了。

pip的配置文件

pip的配置有点奇怪。
我用apt-get安装的pip,他会将包安装到~/.local/中。
但我用pip install --upgrade pip 升级以后,再安装的包就到系统包里了。
每次都要sudo才能安装软件。究竟怎样好?

python类中怎么判断本对象是否存在某个方法并调用

众所周知在php中可以用method_exists和call_user_func来检查类中是否有某方法,并调用之。
但python里面似乎没有这么方便的函数。
python里有两个函数,一个是getattr,一个是hasattr可以完成部分功能,但不是全部功能。
我举个例子:

class ls:
    def a(self):
        act = raw_input('input a action: ')
        if hasattr(self, '%s_action' % act):
            return getattr(self, '%s_action' % act)()
        else:
            print "bad function name!!!"

    def nice_action(self):
        print "nice!!"

    def __bad_action(self):
        print "bad!!"

t = ls()
t.a()

定义了一个简单的类,其中有一个a方法,接受一个输入。输入的字符串和"_action"组成一个方法名。先判断这个方法是否在类中,如果在则调用之,如果不在则输出“bad function name!!!”。
那么,我输入nice,这样就会调用nice_action,但如果我输入__bad,就会输出bad function name:
10.jpg
为什么?按道理来说应该输出“bad!!”才对呀?
因为在python中,类中以2个下划线打头的方法都是私有方法,类似于php里的private,而hasattr、getattr这两个函数是不能取得一个类中私有方法的。
也就是说我前面用hasattr判断类中是否存在__bad_action,实际上就返回的false,因为hasattr不能取得私有方法。
所以,我才说这两个函数只能“完成部分功能”,我还是没有找到万能的方式去在python的类中判断某方法是否存在并调用之。可能还是我对py核心实现原理不了解。

python字符串find和index的区别是什么?

find和index是python中UserString类的两个方法,也就是字符串的两个处理方法。
查文档的话你会看到,这二者的原型都是一样的,功能也是一样的(查找子字符串):

find(self, sub, start=0, end=2147483647)
index(self, sub, start=0, end=2147483647)

那么二者有什么区别呢?
很简单:
str.find当找不到子串的时候,就会返回-1。
str.index找不到子串的时候,会抛出错误。

python怎样转换字符串与数字?

看似简单的一个问题,不就是str()与int()两个内建函数吗?
但有些问题就接踵而至了,str()还好说,int()这个函数当我们传入的参数不是一个“数字型字符串”的时候,就会抛出错误。
举个栗子吧,print int('123aaa'):
01.jpg
果断报错了。而这样的情况如果在php里的话(用intval),是会将'123aaa'转换成123的,不会出错。
更可恶的是int('')一个空字符串也会报错。

于是自己实现一下intval函数:

def intval(str):
    try:
        return int(str)
    except:
        if str and str[0] == '-': l = 1
        else: l = 0
        for t in str[l:]:
            if t.isdigit(): l += 1
            else: break
    try:
        return int(str[0: l])
    except:
        return 0

输出结果:
02.jpg

考虑了负数、空字符的情况,基本和php里的intval类似了吧。