小编Wil*_*lem的帖子

Python:模拟上下文管理器

我不明白为什么我不能在这个例子中模拟NamedTemporaryFile.name:

from mock import Mock, patch
import unittest
import tempfile

def myfunc():
    with tempfile.NamedTemporaryFile() as mytmp:
        return mytmp.name

class TestMock(unittest.TestCase):
    @patch('tempfile.NamedTemporaryFile')
    def test_cm(self, mock_tmp):
        mytmpname = 'abcde'
        mock_tmp.__enter__.return_value.name = mytmpname
        self.assertEqual(myfunc(), mytmpname)
Run Code Online (Sandbox Code Playgroud)

测试结果如下:

AssertionError: <MagicMock name='NamedTemporaryFile().__enter__().name' id='140275675011280'> != 'abcde'
Run Code Online (Sandbox Code Playgroud)

python mocking

50
推荐指数
4
解决办法
2万
查看次数

Python设计模式适用于许多条件

在许多条件下编写验证函数的推荐结构是什么?见这两个例子.第一个看起来很丑,第二个不常见,也许是因为assert通常用来排除意外行为.还有更好的选择吗?

def validate(val):
  if cond1(val):
    return False
  if cond2(val):
    return False
  if cond3(val)
    return False
  return True
Run Code Online (Sandbox Code Playgroud)

要么

def validate(val):
  try:
    assert cond1(val)
    assert cond2(val)
    assert cond3(val)
    return True
  except AssertionError:
    return False
Run Code Online (Sandbox Code Playgroud)

python design-patterns

14
推荐指数
2
解决办法
1689
查看次数

Perl:如何在许多独立脚本之间共享大量模块的导入?

我有很多独立的脚本.他们唯一共享的是,他们使用()一大组CPAN模块(每个模块都导出几个函数).我想集中这个模块列表.我发现了几种方法.哪一个是最好的?

  1. 我可以创建SharedModules.pm来导入所有内容,然后使用Exporter手动将所有内容导出到main ::.

  2. 我可以创建以"package main"开头的SharedModules.pm 所以它会直接导入main ::.它似乎工作.这是不好的做法,为什么?

  3. 我可以要求()一个似乎将所有内容导入main ::的sharedmodules.pl.我不喜欢这种方法,因为在mod_perl下,require()不能很好地工作.

第二个看起来对我来说最好,但是我想知道为什么例如Modern :: Perl不能那样工作.

编辑:我认为之前已经问过这个问题.

perl module

7
推荐指数
2
解决办法
357
查看次数

为什么PHP偶尔挂在session_start()上

注意:这不是欺骗PHP session_start()导致HTTP请求挂起(以及SO上的其他类似命名的问题),因为我的挂起是偶然的,而不是永久性的.

使用Ubuntu 12.04, Magento,PHP-FPM (5.4)而默认的PHP会话处理程序(与EXT4文件).

顺便说一句,(once per month)所有PHP进程都挂起session_start()(根据fpm-slow.log):

[24-Sep-2014 11:03:04]  [pool www] pid 24259
script_filename = /data/web/public/index.php
[0x00007f00b4ec6480] session_start() /data/web/public/includes/src/__default.php:7687
[0x00007f00b4ec6130] start() /data/web/public/includes/src/__default.php:7730
[0x00007f00b4ec5fb8] init() /data/web/public/includes/src/__default.php:8086
[0x00007f00b4ec5e30] init() /data/web/public/includes/src/__default.php:33902
[0x00007f00b4ec5bd0] __construct() /data/web/public/includes/src/__default.php:23841
[0x00007f00b4ec5ae8] getModelInstance() /data/web/public/app/Mage.php:463
[0x00007f00b4ec59c8] getModel() /data/web/public/app/Mage.php:477
[0x00007f00b4ec49a0] getSingleton() /data/web/public/includes/src/__default.php:14044
[0x00007f00b4ec4848] preDispatch() /data/web/public/includes/src/Mage_Adminhtml_Controller_Action.php:160
[0x00007f00b4ec3b00] preDispatch() /data/web/public/includes/src/__default.php:13958
[0x00007f00b4ec26e0] dispatch() /data/web/public/includes/src/__default.php:18331
[0x00007f00b4ec20c0] match() /data/web/public/includes/src/__default.php:17865
[0x00007f00b4ec1a98] dispatch() /data/web/public/includes/src/__default.php:20465
[0x00007f00b4ec1908] run() /data/web/public/app/Mage.php:684
[0x00007f00b4ec17f8] run() /data/web/public/index.php:87
Run Code Online (Sandbox Code Playgroud)

Lsof说:

COMMAND    PID USER   FD …
Run Code Online (Sandbox Code Playgroud)

php session magento

7
推荐指数
1
解决办法
3116
查看次数

Django REST Framework:如何在单元测试中正确使用HyperlinkedModelSerializer url字段

所以我有模型Actor和Role以及使用Viewsets和HyperlinkedModelSerializer的默认REST API.

我的目标:使用关联的Actor创建角色的单元测试.

我的测试代码目前是:

def test_post_create_role_for_actor(self):

    # default actor
    actor = ActorFactory() 

    # inherits HyperlinkedModelSerializer
    actor_serialized = ActorSerializer(actor) 

    postdata = {
        'role': 'mydummyrole',
        'actor': actor_serialized.data['url']
    }

    ret = self.client.post(self.url, json.dumps(postdata), content_type='application/json')

    self.assertEqual(ret.status_code, 201)
    self.assertTrue(Role.objects.filter(role='mydummyrole', actor_id=actor.id).exists())
Run Code Online (Sandbox Code Playgroud)

现在这看起来非常难看,尤其是序列化以检索生成的url字段.事实上,我得到了一个弃用警告:

弃用警告:HyperlinkedIdentityField不推荐在序列化程序上下文中使用而不包括请求.context={'request': request}实例化序列化程序时添加 .

但是,序列化程序生成的"url"字段似乎与任何请求无关.获取此字段的正确方法是什么?我觉得我在这里错过了一个概念.或者两个.

TIA!

python django-rest-framework

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

逆转Python的re.escape

如何反向重新逃生?这个2007年的博客说没有反向功能,但是十年后仍然如此吗?

Python 2 decode('string_escape')不适用于所有转义的字符(例如空格)。

>>> re.escape(' ')
'\\ '
>>> re.escape(' ').decode('string-escape')
'\\ '
Run Code Online (Sandbox Code Playgroud)

Python的3:有些人建议 unicode_escapecodec.escape_decodeast.literal_eval但空间没有运气。

>>> re.escape(b' ')
b'\\ '
>>> re.escape(b' ').decode('unicode_escape')
'\\ '
>>> codecs.escape_decode(re.escape(b' '))
(b'\\ ', 2)
>>> ast.literal_eval(re.escape(b' '))
ValueError: malformed node or string: b'\\ '
Run Code Online (Sandbox Code Playgroud)

那么这真的是唯一有效的方法吗?

>>> re.sub(r'\\(.)', r'\1', re.escape(' '))
' '
Run Code Online (Sandbox Code Playgroud)

python regex escaping python-3.x

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

如何使用 aiohttp 处理 DNS 超时?

aiohttp自述文件说:

如果您想对 aiohttp 客户端使用超时,请使用标准 asyncio 方法:yield from asyncio.wait_for(client.get(url), 10)

但这并不能处理 DNS 超时,我猜这是由操作系统处理的。而且with aiohttp.Timeout不处理操作系统 DNS 查找。

在asyncio repo上进行了讨论,但没有最终结论,Saghul 已经制作了aiodns,但我不确定如何将其混合到 aiohttp 中以及是否允许asyncio.wait_for功能。

测试用例(在我的 Linux 机器上需要 20 秒):

async def fetch(url):
    url = 'http://alicebluejewelers.com/'
    with aiohttp.Timeout(0.001):
        resp = await aiohttp.get(url)
Run Code Online (Sandbox Code Playgroud)

python dns python-3.x python-asyncio aiohttp

4
推荐指数
1
解决办法
1793
查看次数

我可以使用 asyncio.wait_for() 作为上下文管理器吗?

为什么这行不通:

try:
    async with asyncio.wait_for(aiohttp.get(url), 2) as resp:
        print(resp.text())
except asyncio.TimeoutError as e:
    pass
Run Code Online (Sandbox Code Playgroud)

async with asyncio.wait_for(aiohttp.get(url), 2) as resp:
AttributeError: __aexit__
Run Code Online (Sandbox Code Playgroud)

据我了解,asyncio.wait_for()将传递 , 的未来aiohttp.get(),它有一个__aenter__and__aexit__方法(正如有效的事实所证明的那样async with aiohttp.get())。

python-3.x python-asyncio aiohttp

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