小编Ada*_*kin的帖子

在setup.py中没有被2to3控制的测试?

我有一个需要同时支持Python 2和3的setup.py.

代码当前可以工作,可以在Python 2.x中安装

如果我将该use_2to3 = True子句添加到我的setup.py中,那么该模块可以安装在Python 3中,但是,执行以下操作:

python setup.py test
Run Code Online (Sandbox Code Playgroud)

导致失败,因为其中一个测试使用StringIO类,并且导入行在Python 3 from StringIO import StringIO中蠢(目前,在Python3中它应该是from io import StringIO

我想虽然一旦你添加use_2to3关键字,所有测试(包括unittes)都会在测试之前由2to3处理.

我错过了什么?如果它有帮助,我的setup.py的大部分看起来像:

from setuptools import setup

setup(
    name='myproject',
    version='1.0',
    description='My Cool project',
    classifiers = [
        'Programming Language :: Python',
        'Programming Language :: Python :: 3',
    ],

    py_modules=['mymodule'],
    test_suite='test_mymodule',
    zip_safe=False,
    use_2to3 = True,
)
Run Code Online (Sandbox Code Playgroud)

编辑:我觉得2to3没有运行的原因python setup.py test是它爆炸了,堆栈跟踪的底部是:

File "/home/aparkin/temp/mymodule/test_mymodule.py", line 18, in <module>
    from StringIO import StringIO
Run Code Online (Sandbox Code Playgroud)

但是如果我在test_mymodule.py上运行2to3,那么该导入行应该被重新编写为:

from io import StringIO
Run Code Online (Sandbox Code Playgroud)

而且(最坏的情况下)测试应该单独失败.

python unit-testing setup.py python-2to3 python-3.x

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

Python猴子补丁私有功能

我有一个带有函数(调用它a())的模块,它调用在同一模块中定义的另一个函数(调用它__b()). __b()是一个通过网站说话urllib2并获取一些数据的功能.现在我正在尝试测试a(),但当然不希望我的单元测试与公共互联网对话.因此,我在想,如果我可以__b()使用返回固定数据的函数来修补补丁,那么我可以编写测试a().

更具体一点,我的模块看起来有点像:

def a():
    return __b("someval")

def __b(args):
    return something_complex_with_args
Run Code Online (Sandbox Code Playgroud)

所以现在我想测试a(),但我需要修补__b.问题是A)关于猴子补丁的绝大多数信息适用于类的方法,而不适用于模块中的函数,以及B)我想要猴子补丁的函数是私有的.__b如果它使这个过程更可行,我愿意改为非私人,但不愿意.

建议?

编辑:因为它代表测试类看起来像:

from unittest import TestCase

import mymodule

def newfn(args):
    return {"a" : "b"}

mymodule._b = newfn

class TestMyModule(TestCase):
    def test_basic(self):
        print(mymodule.a('somearg'))
Run Code Online (Sandbox Code Playgroud)

当我运行它时,如果没有完成猴子修补,我会看到输出,而不是看到{'a': 'b'}打印出来.

python monkeypatching

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

声纳分支覆盖类声明

我在声纳有一堂课:

public class Foo {
..... much code ....
}
Run Code Online (Sandbox Code Playgroud)

Sonar正在报告该public class Foo线路上的1/2分支机构.这是什么意思?你如何测试一个声明一个类的行?

编辑:如果重要,这是Sonar v3.5.

编辑2:截图显示我的意思,请注意第9行"公共类"旁边的1/2.当悬停在此上方时,我得到一个工具提示,指出"测试覆盖了1个分支"

http://img829.imageshack.us/img829/2626/screenshot20130607at120.png

编辑#3:好的,经过一番调查,我把它缩小到我能找到的最小片段,触发了这个:

public class Foo {

    Foo(final String s) {
        assert (s != null);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果构造函数中不存在该断言,则在Sonar中不会生成"N/2分支覆盖"标志.如果断言消失了,那么旗帜也会消失.所以我的猜测是它基于构造函数中的分支?(此代码的断言行覆盖0/4分支,公共类行覆盖0/2).

java code-coverage sonarqube

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

__ne__是否使用重写的__eq__?

假设我有以下程序:

class A(object):                                                                                                                                                                                                                                                              
    def __eq__(self, other):
        return True

a0 = A() 
a1 = A() 
print a0 != a1
Run Code Online (Sandbox Code Playgroud)

如果你用Python运行它的输出是True.我的问题是

  1. __ne__方法未实现,Python是否属于默认方法?
  2. 如果Python落在默认方法上以确定两个对象是否相等,那么它是否应该调用__eq__然后否定结果?

python comparison equality

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

Python在子进程中使用STDIN

所以我有一个程序,在"主"过程中我触发一个新的Process对象(我想要的)是从STDIN读取行并将它们附加到Queue对象.

基本上,基本的系统设置是有一个"命令获取"过程,用户将输入命令/查询,我需要将这些查询提供给在不同进程中运行的其他子系统.我的想法是通过其他系统可以读取的多处理队列来共享这些.

我所拥有的(专注于获取命令/查询)基本上是:

def sub_proc(q):
    some_str = ""
    while True:
        some_str = raw_input("> ")
        if some_str.lower() == "quit":
            return
        q.put_nowait(some_str)

if __name__ == "__main__":
    q = Queue()
    qproc = Process(target=sub_proc, args=(q,))
    qproc.start()
    qproc.join()

    # now at this point q should contain all the strings entered by the user
Run Code Online (Sandbox Code Playgroud)

问题是我得到:

Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "/home/blah/blah/blah/blah.py", line 325, in sub_proc
    some_str = raw_input("> …
Run Code Online (Sandbox Code Playgroud)

python stdin process

5
推荐指数
2
解决办法
4528
查看次数

Python 3 的 SGML 解析器?

我有一些使用 SGML 构建的文档,并且有一个描述此结构的 DTD 文件。

有人可以向我推荐一个 Python-3 兼容的库或模块来解析这些数据吗?对于 Python 2.x,我的 Google-fu 似乎出现了SGMLParser,但这当然现在已被弃用(并从 Py3k 中彻底删除)。

许多人似乎建议lxml,但由于依赖性问题,这对我来说不是一个选择。

我知道BeautifulSoup这对于混乱的标记来说非常有用,但是 A)最后我听说它与 py3k 不兼容,并且 B)该内容结构良好。

sgml xml-parsing python-3.x

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

Postgresql 多对多关系插入

我正在使用 Postresql 9.3.5。我在实体“Foo”和“Bar”之间存在多对多关系,我将其建模为如下所示:

CREATE TABLE Foo
(
    id SERIAL PRIMARY KEY NOT NULL,
    .... various columns for foo ....
);

CREATE TABLE Bar
(
    id SERIAL PRIMARY KEY NOT NULL,
    field1 varchar(50) UNIQUE NOT NULL,
    .... various columns for bar ....
);

CREATE TABLE FooBar
(
    fooID int NOT NULL,
    barID int NOT NULL,
    PRIMARY KEY (fooID, barID),
    FOREIGN KEY (fooID) REFERENCES Foo(id),
    FOREIGN KEY (barID) REFERENCES Bar(id)
);
Run Code Online (Sandbox Code Playgroud)

现在我要做的就是在 Foo 中插入一条记录,在 Bar 中插入一条相应的记录,然后插入包含 foo 和 bar 条目 id 的匹配 …

postgresql sql-insert

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

C# 字典等效于 Python 的 get() 方法

在 Python 中,如果我有一个 dict,并且我想从一个可能不存在密钥的 dict 中获取一个值,我会执行以下操作:

lookupValue = somedict.get(someKey, someDefaultValue)
Run Code Online (Sandbox Code Playgroud)

其中,如果someKey不存在,则someDefaultValue返回。

在 C# 中,有些TryGetValue()类似:

var lookupValue;
if(!somedict.TryGetValue(someKey, lookupValue))
    lookupValue = someDefaultValue;
Run Code Online (Sandbox Code Playgroud)

一个问题是,如果someKeynull然后抛出异常,所以你进行了空检查:

var lookupValue = someDefaultValue;
if (someKey != null && !somedict.TryGetValue(someKey, lookupValue))
    lookupValue = someDefaultValue;
Run Code Online (Sandbox Code Playgroud)

哪个,TBH,是 icky(3 行用于 dict 查找?)有没有更简洁(即 1 行)的方式,很像 Python 的get()

c# python dictionary

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

Python中的单元测试理论?

在以前的生活中,我做了相当多的Java开发,并发现JUnit Theories非常有用.Python有没有类似的机制?

目前我做的事情如下:

def some_test(self):
    cases = [('some sample input', 'some expected value'),
            ('some other input', 'some other expected value')]

    for value, expected in cases:
        result = method_under_test(value)
        self.assertEqual(expected, result)
Run Code Online (Sandbox Code Playgroud)

但这是相当笨重的,如果第一个"案例"失败,其他所有案件都无法运行.

python unit-testing junit-theory

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

Python asyncio run_coroutine_threadsafe 从不运行协程?

我不确定我在这里做错了什么,我试图拥有一个包含队列并使用协程来消耗该队列上的项目的类。问题是事件循环正在一个单独的线程中运行(在该线程中我是为了loop.run_forever()让它运行)。

但我看到的是,用于消费项目的协程从未被触发:

import asyncio
from threading import Thread

import functools

# so print always flushes to stdout
print = functools.partial(print, flush=True)


def start_loop(loop):
    def run_forever(loop):
        print("Setting loop to run forever")
        asyncio.set_event_loop(loop)
        loop.run_forever()
        print("Leaving run forever")

    asyncio.set_event_loop(loop)
    print("Spawaning thread")
    thread = Thread(target=run_forever, args=(loop,))
    thread.start()


class Foo:
    def __init__(self, loop):
        print("in foo init")
        self.queue = asyncio.Queue()
        asyncio.run_coroutine_threadsafe(self.consumer(self.queue), loop)

    async def consumer(self, queue):
        print("In consumer")
        while True:
            message = await queue.get()
            print(f"Got message {message}")
            if message == "END OF QUEUE":
                print(f"exiting …
Run Code Online (Sandbox Code Playgroud)

python python-multithreading python-asyncio

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