我有一个需要同时支持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)
而且(最坏的情况下)测试应该单独失败.
我有一个带有函数(调用它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'}打印出来.
我在声纳有一堂课:
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个分支"

编辑#3:好的,经过一番调查,我把它缩小到我能找到的最小片段,触发了这个:
public class Foo {
Foo(final String s) {
assert (s != null);
}
}
Run Code Online (Sandbox Code Playgroud)
如果构造函数中不存在该断言,则在Sonar中不会生成"N/2分支覆盖"标志.如果断言消失了,那么旗帜也会消失.所以我的猜测是它基于构造函数中的分支?(此代码的断言行覆盖0/4分支,公共类行覆盖0/2).
假设我有以下程序:
class A(object):
def __eq__(self, other):
return True
a0 = A()
a1 = A()
print a0 != a1
Run Code Online (Sandbox Code Playgroud)
如果你用Python运行它的输出是True.我的问题是
__ne__方法未实现,Python是否属于默认方法?__eq__然后否定结果?所以我有一个程序,在"主"过程中我触发一个新的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) 我有一些使用 SGML 构建的文档,并且有一个描述此结构的 DTD 文件。
有人可以向我推荐一个 Python-3 兼容的库或模块来解析这些数据吗?对于 Python 2.x,我的 Google-fu 似乎出现了SGMLParser,但这当然现在已被弃用(并从 Py3k 中彻底删除)。
许多人似乎建议lxml,但由于依赖性问题,这对我来说不是一个选择。
我知道BeautifulSoup这对于混乱的标记来说非常有用,但是 A)最后我听说它与 py3k 不兼容,并且 B)该内容结构良好。
我正在使用 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 的匹配 …
在 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)
一个问题是,如果someKey是null然后抛出异常,所以你进行了空检查:
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()?
在以前的生活中,我做了相当多的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)
但这是相当笨重的,如果第一个"案例"失败,其他所有案件都无法运行.
我不确定我在这里做错了什么,我试图拥有一个包含队列并使用协程来消耗该队列上的项目的类。问题是事件循环正在一个单独的线程中运行(在该线程中我是为了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 ×7
python-3.x ×2
unit-testing ×2
c# ×1
comparison ×1
dictionary ×1
equality ×1
java ×1
junit-theory ×1
postgresql ×1
process ×1
python-2to3 ×1
setup.py ×1
sgml ×1
sonarqube ×1
sql-insert ×1
stdin ×1
xml-parsing ×1