小编bow*_*bow的帖子

Python - 测试抽象基类

我正在寻找在抽象基类中定义的测试方法的方法/最佳实践.我可以直接想到的一件事是在基类的所有具体子类上执行测试,但这在某些时候似乎过多.

考虑这个例子:

import abc

class Abstract(object):

    __metaclass__ = abc.ABCMeta

    @abc.abstractproperty
    def id(self):
        return   

    @abc.abstractmethod
    def foo(self):
        print "foo"

    def bar(self):
        print "bar"
Run Code Online (Sandbox Code Playgroud)

是否可以在bar不进行任何子类化的情况下进行测试?

python oop testing abc

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

在python中使用默认消息引发内置异常

我正在尝试实现一个方法,只要某个目录不存在就会返回错误.

raise OSError("Directory does not exist.")但是,我想使用OSError中的builtint错误消息,而不是这样做OSError: [Errno 2] No such file or directory:.这是因为我在方法调用的开头提高异常,而不是稍后(它将从python调用相同的消息,没有任何必要raise).

有什么指针吗?(手动OSError("[Errno 2] No such file or directory: ")除外)

python exception

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

python - 在Python 3.2 testenv上运行tox + nosetests

我一直在尝试实现一个单源测试系统,允许使用tox + nosetests跨多个Python版本进行自动测试.

问题是,每当我测试Python 3.2时,我都无法使它工作.如果我排除Python 3.2,一切正常.

这是我的tox.ini:

[tox]
envlist = py25,py26,py27,py32,pypy,jython

[testenv]
commands =
    nosetests []
deps =
    nose
    mock

[testenv:py32]
commands =
    nosetests []
Run Code Online (Sandbox Code Playgroud)

和我的~/.noserc:

[nosetests]
verbosity=2
with-doctest=1
Run Code Online (Sandbox Code Playgroud)

我在我的setup.py中设置了use_2to3标志True,但是这个错误不断出现:NameError: global name 'basestring' is not defined.似乎我错过了一些应该2to3工作的设置,但我不知道它是什么.

此外,我试图取代nosetests []python setup.py testtestenv:py32设置.不幸的是,不仅相同的错误不断出现,还引入了另一个错误:Error in atexit._run_exitfuncs: TypeError: 'NoneType' object is not callable.

有什么指针吗?

编辑:添加代码setup.py,以防它有用:

# handle python 3
if sys.version_info >= (3,): …
Run Code Online (Sandbox Code Playgroud)

python testing automated-tests nose python-3.x

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

python - 循环遍历可迭代类的开销

我正在摆弄Python的生成器和可迭代类,只是为了好玩.基本上我想测试一些我从来不太确定的东西:Pythons中的类有一些显着的开销,如果可以的话,最好依赖实现的方法yield而不是实现迭代器协议的类.

我无法找到有关此主题的谷歌一个令人满意的解释,所以我决定用这两个简单的脚本来测试他们对我自己:func_iter.pyclass_iter.py

这是func_iter.py:

#!/usr/bin/env python

import time  

x = 0
def create_generator(num):
    mylist = range(num)
    for i in mylist:
        yield i

t = time.time()
gen = create_generator(100000)

for i in gen:
    x = x + i

print "%.3f" % (time.time() - t)
Run Code Online (Sandbox Code Playgroud)

这是class_iter.py:

#!/usr/bin/env python

import time

x = 0

class Generator(object):

    def __init__(self, num):
        self.start = 0
        self.end = num

    def __iter__(self):
        return self

    def next(self):
        if self.start == self.end: …
Run Code Online (Sandbox Code Playgroud)

python performance benchmarking

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

在python 3中使用itertools.product和列表

我正在尝试根据蛋白质序列创建一个可能的密码子列表.

基本上,我正在尝试创建的脚本将处理给定的字符串输入并输出输入所代表的另一组字符串的可能组合.

例如,字符"F"代表"UUU"或"UUC"; 角色'I'代表'AUU','AUC'或'AUA'.

鉴于输入'FI',我试图创建的脚本应该输出:'UUUAUU','UUUAUC','UUUAUA','UUCAUU','UUCAUC'和'UUCAUA'.

我目前仍然坚持使用此代码:

import itertools

F = ['UUU', 'UUC']
I = ['AUU', 'AUC', 'AUA']

seq, pool = 'FI', []

for i in seq:
   pool.append(eval(i))

for n in itertools.product(pool):
   print(n)
Run Code Online (Sandbox Code Playgroud)

当我替换poolitertools.product,它工作pool[0], pool[1].但我无法弄清楚如何使其工作,以便用户可以输入超过2个字符的字符串(即不使其硬编码).

在此先感谢您的帮助!

python python-itertools python-3.x

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

Java中"while"的问题

我正在尝试Java编程书中的几个练习.我有以下代码:

import java.io.*;
import java.util.Scanner;

public class Ex420
{
 public static void main( String args[] )
 {
  String employeeName = "";
  double workHours,excessHours, hourlyRates, grossPay;
  Scanner input = new Scanner( System.in );

  while ( employeeName != "stop" )
  {
   System.out.printf( "\nInput employee name or stop to exit: " );
    employeeName = input.nextLine();
   System.out.printf( "Input working hours: " );
    workHours = input.nextDouble();
   System.out.printf( "Input hourly rates: " );
    hourlyRates = input.nextDouble();

   if ( workHours <= 40 & workHours >= 0 ) …
Run Code Online (Sandbox Code Playgroud)

java loops while-loop

6
推荐指数
2
解决办法
1556
查看次数

Java中的扫描仪无法正常工作

我正在尝试编写一个非常简单的猜数游戏(代码如下).在完成1轮之后,用户应该能够决定他/她是否想要进行另一轮比赛.问题是,程序总是跳过最后一个问题(永远不要让用户回答'y'或其他问题.我在这里缺少什么?有什么关于java.util.Scanner我不知道的吗?

import java.util.Random;
import java.util.Scanner;

public class GuessNum {

public GuessNum() {         

        int numRandom = 0;    
        int numGuess;    
        int life = 5;    
        String want = "";    
        Random rand = new Random();    
        Scanner scan = new Scanner(System.in);

        do {
            int lifeLeft = 5;
            numRandom = rand.nextInt(9)+1;

            System.out.print("\nGuess the Number [1..10]\n");
            System.out.print("===================\n");
            System.out.print("You have " + lifeLeft + " chances.\n");

            do {
                do {
                    System.out.print("What number do I have in mind: ");
                    numGuess = scan.nextInt();

                    if (numGuess < 1 || …
Run Code Online (Sandbox Code Playgroud)

java input java.util.scanner

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

python - 访问使用补丁模拟的对象

我一直在使用该mock库来进行一些测试.到目前为止它一直很棒,但有一些我还没有完全理解的东西.

mock提供了一种使用修补整个方法的好方法patch,我可以像这样的方法访问修补对象:

@patch('package.module')
def test_foo(self, patched_obj):
    # ... call patched_obj here
    self.assertTrue(patched_obj.called)
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我patch在整个类上使用装饰器,我如何访问修补对象?

例如:

@patch('package.module')
class TestPackage(unittest.TestCase):

    def test_foo(self):
        # how to access the patched object?
Run Code Online (Sandbox Code Playgroud)

python testing unit-testing mocking

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

使用python替换特定行中的字符串

我正在编写一个python脚本来替换具有特定扩展名(.seq)的目录中的每个文本文件中的字符串.替换的字符串应该只来自每个文件的第二行,并且输出是一个新的子目录(称之为干净),其文件名与原始文件相同,但带有*.clean后缀.输出文件包含与原始文本完全相同的文本,但替换了字符串.我需要替换所有这些字符串:'K','Y','W','M','R','S'和'N'.

这是我在谷歌搜索后想出来的.这是非常混乱的(编程的第二周),它停止将文件复制到干净的目录而不替换任何东西.我真的很感激任何帮助.

谢谢!

import os, shutil

os.mkdir('clean')

for file in os.listdir(os.getcwd()):
    if file.find('.seq') != -1:
        shutil.copy(file, 'clean')

os.chdir('clean')

for subdir, dirs, files in os.walk(os.getcwd()):
    for file in files:
        f = open(file, 'r')
        for line in f.read():
            if line.__contains__('>'): #indicator for the first line. the first line always starts with '>'. It's a FASTA file, if you've worked with dna/protein before.
                pass
            else:
                line.replace('M', 'N')
                line.replace('K', 'N')
                line.replace('Y', 'N')
                line.replace('W', 'N')
                line.replace('R', 'N')
                line.replace('S', 'N')
Run Code Online (Sandbox Code Playgroud)

python replace

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