小编use*_*028的帖子

pylint 1.4报告所有C扩展上的E1101(无成员)

我们一直是粉丝的忠实粉丝pylint.它的静态分析已成为我们所有python项目的关键部分,并且节省了大量时间来追逐晦涩的错误.但是从1.3 - > 1.4升级后,几乎所有编译的c扩展都会导致E1101(无成员)错误.

之前通过pylint1.3 运行完全清洁的项目现在抱怨几乎每个使用E1101的C扩展成员.我们被迫禁用E1101错误,但这实际上减损了它的用处pylint.

例如,这完全有效地使用了lxml

r"""valid.py: demonstrate pylint 1.4 error"""
from lxml import etree
print etree.Element('mydoc')
Run Code Online (Sandbox Code Playgroud)

运行此过程pylint,它会报告:

$ pylint -rn valid.py
No config file found, using default configuration
************* Module valid
E:  3, 6: Module 'lxml.etree' has no 'Element' member (no-member)
Run Code Online (Sandbox Code Playgroud)

但它完全有效:

$ python valid.py
<Element mydoc at 7fddf67b1ba8>
Run Code Online (Sandbox Code Playgroud)

这里真的很奇怪.一小部分C扩展似乎可以正常工作pylint,例如:

r"""valid2.py: this one works fine"""
import sqlite3
print sqlite3.version

$ pylint -rn valid2.py
No config file …
Run Code Online (Sandbox Code Playgroud)

python pylint python-extensions

47
推荐指数
3
解决办法
9851
查看次数

处理sqlalchemy断开连接的更好方法

我们一直在尝试sqlalchemy的断开处理,以及它如何与ORM集成.我们研究了文档,建议似乎是捕获断开连接异常,发出rollback()并重试代码.

例如:

import sqlalchemy as SA

retry = 2
while retry:
    retry -= 1
    try:
        for name in session.query(Names):
            print name
        break
    except SA.exc.DBAPIError as exc:
        if retry and exc.connection_invalidated:
            session.rollback()
        else:
            raise
Run Code Online (Sandbox Code Playgroud)

我遵循基本原理 - 您必须回滚任何活动的事务并重放它们以确保您的操作的一致排序.

但是 - 这意味着每个想要处理数据的函数都会添加许多额外的代码.此外,在这种情况下SELECT,我们不修改数据,回滚/重新请求的概念不仅难看,而且违反DRY原则(不要重复自己).

我想知道其他人是否会介意分享他们如何处理与sqlalchemy的断开连接.

仅供参考:我们使用的是sqlalchemy 0.9.8和Postgres 9.2.9

python postgresql sqlalchemy

19
推荐指数
1
解决办法
3949
查看次数

鼻子单元测试发现在 python 3.8 上被破坏

今天从python 3.7升级到3.8。鼻子中的单元测试发现不再有效。

简化的项目布局

x:\proj\src\__init__.py
x:\proj\src\first.py
x:\proj\tests\__init.py
x:\proj\tests\testfirst.py
Run Code Online (Sandbox Code Playgroud)

从项目 root x:\proj,运行:

nosetests -v
-----------------------------------------------
Ran 0 tests in 0.016s

OK
Run Code Online (Sandbox Code Playgroud)

只能通过指定它们来运行单元测试,例如:

nosetests tests.testfirst
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Run Code Online (Sandbox Code Playgroud)

平台

  • 鼻子测试版本 1.3.7
  • Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 位 (AMD64)] on win32

unit-testing nose python-3.x

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

正确的mock.patch smtplib.SMTP方法

smtplib.SMTP.sendmail尝试在单元测试中模拟.修补调用。该sendmail方法似乎已成功模拟,我们可以将其查询为MagicMock,但sendmail 模拟的calledcalled_args属性未正确更新。看来我没有正确应用补丁。

这是我正在尝试的一个简化示例:

import unittest.mock
with unittest.mock.patch('smtplib.SMTP', autospec=True) as mock:
    import smtplib
    smtp = smtplib.SMTP('localhost')
    smtp.sendmail('me', 'me', 'hello world\n')
    mock.assert_called()           # <--- this succeeds
    mock.sendmail.assert_called()  # <--- this fails
Run Code Online (Sandbox Code Playgroud)

此示例生成:

AssertionError: Expected 'sendmail' to have been called.
Run Code Online (Sandbox Code Playgroud)

如果我将补丁更改为smtp.SMTP.sendmail;例如:

with unittest.mock.patch('smtplib.SMTP.sendmail.', autospec=True) as mock:
    ...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以成功访问模拟的called_args和属性,但由于允许进行初始化,因此与主机建立了实际的 smtp 会话。这是单元测试,我不希望发生实际的网络。calledsmtplib.SMTP

python mocking smtplib

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

Django添加类以形成<input ..>字段

我们正在寻找一种解决方案,将一个CSS类属性添加到Django表单的<input..>字段中.我们已经看到了建议我们在<div> http://docs.djangoproject.com/en/1.2/topics/forms/#customizing-the-form-template中包含该字段的建议,但这个建议似乎主要适用于字段标签,不是它<input ...>.

如果您尝试在<input>字段周围创建边框,则此特定建议不起作用.在这种情况下,<div>将应用于边界框,而不是实际的输入字段.例如,.wrapper { border: 1px solid #666;line-height:22px;height:22px;padding:3px 5px;width:205px;}将在字段周围创建一个框,而不是替换默认<input ...>边框.

我们已经退回到通过应用于Form类的小部件来应用该类,但这缺乏一定数量的代码优雅(并且违反了DRY).例如,这解决了这个问题.

class ContactUsForm(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs={'class':'form_text'}))
Run Code Online (Sandbox Code Playgroud)

但是,当然,这会将表单与CSS紧密联系起来.如果您尝试将类属性应用于<input ..>字段,如果表单基于酷炫的新表单,那么它会变得更复杂.ModelForm系统.

我们花了两天的时间来讨论这个问题(并研究Django源代码),看起来我们可能会在这个特定问题上达到Django最远的边缘 - 但我们只想接受一次传递在StackOverflow看看是否有其他人有洞察力.

感谢您的任何见解.

最后一条评论:如果问题是我们理解CSS(而不是django),请随意让我们直截了当.我们花了很多时间搞乱CSS选项,但它们似乎都没有让我们完成所需的效果 - 即取代默认<input...>边框.

django-templates django-forms

6
推荐指数
1
解决办法
8562
查看次数

如何从 Python/C 创建 lambda

我们正在处理一些 Python/C-API 代码,我们遇到了一个想要传递回调的方法。该方法将定期更新回调作为反馈的形式。事实证明,我们对定期反馈并不那么感兴趣。禁用该方法的默认反馈机制的唯一方法是向它传递某种回调。

我们采用的技术是声明一个只返回 None 的模块级函数,即:

static PyObject*
donothing(PyObject* self, PyObject* args) {
    return Py_None;
    }
Run Code Online (Sandbox Code Playgroud)

但是当然这个函数也需要在modules方法表中注册,即:

static PyMethodDef methods[] = {
    {"donothing", donothing, METH_VARARGS, "do nothing"},
     ...
    {NULL}
    };
Run Code Online (Sandbox Code Playgroud)

然后,当我们去调用该方法时,我们需要抓取这个方法的引用,即: PyObject_GetAttrString(module_reference, "donothing").

所有这一切都让人感觉我们花费了太多时间来转动我们的轮子却什么都不做。然后它发生在我身上..嘿,似乎是lambda x: None的完美用法。但是在 Python/C-API 文档上花了一个小时后,我无法弄清楚人们是如何创建 lambda 表达式的。

我看到页面http://docs.python.org/2/c-api/function.html上有对闭包的引用,但我无法弄清楚如何创建它们的详细信息。

任何指针(或对 RTFM 的引用)将不胜感激。

python python-c-api

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

扩展 vuetify VTextField

我正在尝试扩展 vuetifyVTextField组件来创建可重用的password-field. 有许多道具可以控制我们需要改变的组件。Vuejs 认为 prop 突变是一种“反模式”,并对其发出警告。

我尝试过声明一个计算属性来覆盖有效的 prop,但它会在 Web 控制台中抛出有关冲突的警告。

这是一个简单的例子:

import Vue from 'vue'
import { VTextField } from 'vuetify/lib'

export default Vue.extend({
    name: 'password-field',
    mixins: [VTextField],
    data: () => ({
        reveal: false
    }),
    computed: {
        function type () {
            return this.reveal ? 'text' : 'password'
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

感觉应该可以使用 mixins 来扩展 VTextField 并有选择地删除我们想要用计算属性替换的 props。最后,我们需要该值是反应性的并且受password-field组件的控制——而不是由父组件控制。

我在这里走错方向了吗?

更新

根据Yom S ()提供的专家建议,我能够创建VTextField. 我们采纳了他的建议#2,即 SFC 模板化组件。

对于其他偶然发现这个主题的人,这里是 Typescript 兼容的实现:

<!-- put this …
Run Code Online (Sandbox Code Playgroud)

typescript vue.js vuetify.js

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

编码期间出现 UnicodeDecodeError?

我们遇到了一个问题(http://wiki.python.org/moin/UnicodeDecodeError对此进行了描述)——阅读第二段“...自相矛盾...”。

具体来说,我们正在尝试将字符串上转换为 unicode,但我们收到了 UnicodeDecodeError。

例子:

   >>> unicode('\xab')
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

但当然,这工作起来没有任何问题

   >>> unicode(u'\xab')
   u'\xab'
Run Code Online (Sandbox Code Playgroud)

当然,这段代码是为了演示转换问题。在我们的实际代码中,我们没有使用字符串文字,我们不能只在前面添加 unicode 'u' 前缀,而是我们正在处理从 os.walk() 返回的字符串,并且文件名包含上述值。由于我们无法在不调用 unicode() 构造函数的情况下将值强制转换为 unicode,因此我们不确定如何继续。

发生的一种非常可怕的黑客行为是编写我们自己的 str2uni() 方法,如下所示:

def str2uni(val):
    r"""brute force coersion of str -> unicode"""
    try:
        return unicode(src)
    except UnicodeDecodeError:
        pass
    res = u''
    for ch in val:
       res += unichr(ord(ch))
    return res
Run Code Online (Sandbox Code Playgroud)

但在我们这样做之前——想看看其他人是否有任何见解?

更新

我发现每个人都在关注我如何得到我发布的示例,而不是结果。叹息 …

python unicode

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

python Exceptions中意外的参数处理

在创建自定义Exception类时,我遇到了基本Exception类处理参数的意外情况.具体来说,它是如何设置'message'属性的.

当您将多个参数传递给它时Exception.__init__(),它不会初始化消息属性.例如,这是有效的

>>> e = Exception('msg')
>>> e.message
'msg'
Run Code Online (Sandbox Code Playgroud)

但这不会设置消息属性

>>> e = Exception('msg', 'extra')
>>> e.message
''
Run Code Online (Sandbox Code Playgroud)

它当然会存储args属性中的所有参数:

>>> e = Exception('msg', 'extra')
>>> e.args
('msg', 'extra')
Run Code Online (Sandbox Code Playgroud)

任何人都可以阐明这一点吗?我已经浏览了Exception文档,但是我很难理解为什么Exception类会这样做.如果重要,这是python 2.7

python exception-handling

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

如何从字符串中删除元音

我正在尝试使用传递名为"text"的参数的函数从字符串中删除所有元音.我不确定这是否是最有效的编码方式,但这是我能想到的.我不知道如何告诉函数,以检查是否"文本"有任何从"元音"列表中的字符,如果是这样,将其删除.我认为在.replace()函数中用空格替换它会做到这一点,但显然不是.该代码应该删除低和大写元音,所以我不确定是否将它们全部小写甚至可以接受.提前致谢.

def anti_vowel(text): #Function Definition

    vowels = ['a','e','i','o','u'] #Letters to filter out
    text = text.lower() #Convert string to lower case

    for char in range(0,len(text)):
        if char == vowels[0,4]:
            text = text.replace(char,"")

        else:
            return text
Run Code Online (Sandbox Code Playgroud)

python function list

0
推荐指数
1
解决办法
774
查看次数

将100纳秒转换为毫秒级的混淆

注意:这可能是关于有缺陷的数学的问题,而不是关于问题中描述的Windows系统调用的问题.

我们正在使用GetSystemTimeAsFileTime()win32调用,看到我认为是奇怪的结果,并正在寻找一些澄清.来自MSDN的FILETIME结构https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx

包含一个64位值,表示自1601年1月1日(UTC)以来100纳秒间隔的数量.

根据我们对此描述的读取,返回的值是10e-8间隔秒的数量.假设这是正确的,那么以下函数应该以毫秒为单位返回系统时间.

DWORD get_milli_time() {
    FILETIME f;
    ::GetSystemTimeAsFileTime(&f);
    __int64 nano = (__int64(f.dwHighDateTime) << 32LL)
                  + __int64(f.dwLowDateTime);
    return DWORD(nano / 10e5);
    }
Run Code Online (Sandbox Code Playgroud)

然而,一个简单的单元测试显示这是不正确的,下面的代码打印"失败":

DWORD start = get_milli_time();
::Sleep(5000);  // sleep for 5-seconds
DWORD end = get_milli_time();
// test for reasonable sleep variance (4.9 - 5.1 secs)
if ((end - start) < 4900 || (end - start) > 5100) {
    printf("Failed\n");
    }
Run Code Online (Sandbox Code Playgroud)

根据这个SO帖子 从Windows中的系统时钟获取当前时间(以毫秒为单位)?,通过将我们的部门改为:

return DWORD(nano / 10e3);
Run Code Online (Sandbox Code Playgroud)

如果我们使用这个值,我们得到正确的结果,但我不明白为什么.

在我看来,要从10e-8转换为10e-3 …

c++ windows time filetime

0
推荐指数
1
解决办法
1648
查看次数