小编les*_*nik的帖子

在python中结合'with'和'yield'是否安全?

在python中使用上下文管理器自动关闭文件是一个常见的习惯用法:

with open('filename') as my_file:
    # do something with my_file

# my_file gets automatically closed after exiting 'with' block
Run Code Online (Sandbox Code Playgroud)

现在我想读几个文件的内容.数据的使用者不知道或不关心数据是来自文件还是非文件.它不想检查它收到的对象是否可以打开.它只是想从中获取内容.所以我创建了一个像这样的迭代器:

def select_files():
    """Yields carefully selected and ready-to-read-from files"""
    file_names = [.......]
    for fname in file_names:
        with open(fname) as my_open_file:
            yield my_open_file
Run Code Online (Sandbox Code Playgroud)

这个迭代器可以像这样使用:

for file_obj in select_files():
    for line in file_obj:
        # do something useful
Run Code Online (Sandbox Code Playgroud)

(注意,可以使用相同的代码来消耗不是打开的文件,而是使用字符串列表 - 这很酷!)

问题是:产生打开文件是否安全?

看起来像"为什么不呢?".消费者调用迭代器,迭代器打开文件,将其产生给消费者.消费者处理文件并返回下一个迭代器.迭代器代码恢复,我们退出'with'块,my_open_file对象关闭,转到下一个文件等.

但是,如果消费者永远不会回到下一个文件的迭代器呢?消费者内部发生异常.或者消费者在其中一个文件中发现了一些非常令人兴奋的内容,并愉快地将结果返回给任何人调用它?

迭代器代码在这种情况下永远不会恢复,我们永远不会到'with'块结束,my_open_file对象永远不会被关闭!

或者是吗?

python yield with-statement

29
推荐指数
2
解决办法
5360
查看次数

Python:异步线程有什么优势?

我很难理解如何以及为什么异步功能在python中工作,我仍然不确定我是否正确理解了所有内容(特别是'为什么'部分).如果我错了,请纠正我.

异步方法和线程的目的是使同时处理多个任务成为可能.

线程方法看起来简单直观.如果python程序同时处理多个任务,我们每个任务都有一个线程(可能有子线程),每个线程的堆栈反映了当前处理相应任务的阶段.一切都很简单,有一些易于使用的机制来启动新线程并等待它的结果.

据我所知,这种方法的唯一问题是线程很昂贵.

另一种方法是使用async协同程序.我可以通过这种方法看到一些不便之处.我只会说出几个人的名字.我们现在有两种方法:通常的方法和async方法.90%的时间唯一的区别是你需要记住这个方法是,async并且await在调用此方法时不要忘记使用关键字.是的,你不能async从正常方法中调用方法.所有这些async- await程序周围的语法垃圾只是表明这种方法能够控制消息循环.

线程方法没有所有这些不便之处.但是async- await方法允许处理比线程方法更多的并发任务.怎么可能?

对于每个并发任务,我们仍然有一个调用堆栈,现在它只是一个协程调用堆栈.我不太确定,但看起来这是关键的区别:通常的堆栈是操作系统堆栈,它们很昂贵,协程栈只是一个python结构,它们便宜得多.这是我的理解吗?

如果这是正确的,那么从操作系统线程/调用堆栈中解除python线程/调用堆栈以使python线程更便宜会不会更好?

对不起,如果这个问题很愚蠢.我确信有一些原因async- await选择了方法.只是想了解这些原因.

更新:

对于那些不认为这个问题不好而且过于宽泛的人.

这是一篇不屈不挠的文章- 首先解释为什么线程不好而广告async接近.主要论点:线程是邪恶的,很难推断可以同时从任意数量的线程执行的例程.

感谢Nathaniel J. Smith(python Trio图书馆的作者)建议这个链接.

顺便说一句,文章中的论点对我来说并不令人信服,但仍然有用.

python multithreading asynchronous async-await python-asyncio

14
推荐指数
1
解决办法
9137
查看次数

是什么导致了这个神秘的 pylint E1101 错误?

我有以下代码:

#!/usr/bin/env python                                                                 
"""pylint behavior test"""                                                            
                                                                                      
                                                                                      
def autodetect_method(method, data):                                                  
    """autodetect method"""                                                           
    if not method:                                                                    
        method = 'POST' if data else 'GET'                                            
    else:                                                                             
        method = method.upper()                                                       
                                                                                      
    return method
Run Code Online (Sandbox Code Playgroud)

pylint 产生以下错误:

tt.py:10:17: E1101: Class 'method' has no 'upper' member (no-member)
Run Code Online (Sandbox Code Playgroud)

如果我将method变量重命名为其他名称,则不会报告错误,fe 为method_name! 所以,我知道几种方法来摆脱这个错误信息。但是我很好奇变量名有什么特别之处,method为什么会产生错误?

以防万一这个问题是特定于版本的,我的版本是:

$ pylint --version
pylint 2.4.4
astroid 2.3.3
Python 3.8.5 (default, Jan 27 2021, 15:41:15) 
[GCC 9.3.0]
Run Code Online (Sandbox Code Playgroud)

python pylint

5
推荐指数
1
解决办法
130
查看次数

c ++ Google测试(gtest):如何创建自定义断言和期望?

我正在使用gtest为我的C ++程序创建单元测试。在我的测试中,我必须写很多这样的检查:

ASSERT_TRUE(myObject.IsValid());
EXPECT_EQ(myObject.GetSomeAttribute(), expectedValue);
Run Code Online (Sandbox Code Playgroud)

我必须写两个检查,因为如果我省略ASSERT_TRUEmyObject碰巧是无效的,则会myObject.GetSomeAttributre()导致调用崩溃。即使在测试中也不是很好。

我想要写的是这样的:

EXPECT_XXX_EQ(myObject.GetSomeAttribute(), expectedValue);
Run Code Online (Sandbox Code Playgroud)

这行代码应该与原始的两行大致相同(带有可选的奖励,如果myObject无效,将被报告,GetSomeAttribute()不会被调用,但是测试将继续运行)。

如何编写这样的自定义断言/期望?

c++ unit-testing googletest

3
推荐指数
1
解决办法
1950
查看次数

我应该使用功能还是功能!在vim脚本中?

我想我明白之间的差别functionfunction!:如果用相同名称的功能已经存在function!默默地取代它,但function会产生错误.

我最终function!总是使用.因为如果我function早晚使用简单它会返回并咬我:

E122: Function my_lib#MyHandyFunction already exists, add ! to replace it
Run Code Online (Sandbox Code Playgroud)

有没有人应该使用简单的function没有!

vim

2
推荐指数
1
解决办法
83
查看次数

Python,sqlalchemy:如何提高加密sqlite数据库的性能?

我有一个简单的服务应用程序:python,tornado web服务器,sqlite数据库.数据库已加密.

问题是处理甚至非常简单的http请求大约需要300毫秒.

从日志中我可以看到,无论第一个请求多么简单,大部分时间都会处理第一个sql请求.后续的sql请求处理得更快.但随后服务器开始处理下一个http请求,并且第一个sql请求再次非常慢.

如果我关闭数据库加密问题就消失了:sql请求的处理时间不取决于请求是否是第一个,而我的服务器响应时间减少了10到15倍.

我不太明白发生了什么.看起来sqlalchemy每次启动新会话时都会读取和解密数据库文件.有没有办法解决这个问题?

python sqlalchemy tornado

2
推荐指数
1
解决办法
356
查看次数