Unpickling fails with __new__() takes exactly 1 argument (2 given)
Question: When I'm trying to load a pickled list it says:

    
    
    >>> import pickle
    >>> with open('tests/unit/support/modules_state.samples2.6') as f:
    ...     print(pickle.load(f))
    ...     
    Traceback (most recent call last):
      File "<console>", line 2, in <module>
      File "/usr/lib/python2.6/pickle.py", line 1370, in load
        return Unpickler(file).load()
      File "/usr/lib/python2.6/pickle.py", line 858, in load
        dispatch[key](self)
      File "/usr/lib/python2.6/pickle.py", line 1083, in load_newobj
        obj = cls.__new__(cls, *args)
    TypeError: __new__() takes exactly 1 argument (2 given)
    

Here's the code that loads/dumps the pickled list:

    
    
    class FakeModuleNameGenerator(str):
        def __new__(cls):
            return super(FakeModuleNameGenerator, cls).__new__(cls, binascii.b2a_hex(os.urandom(15)))
    
    
    class FakeModule(object):
        def __new__(cls, *args, **kwargs):
            return choice([object(), TestDouble()])
    
    
    class SamplesIterator(object):
        MAX_SAMPLE_LENGTH = os.getenv('MAX_SAMPLE_LENGTH', 12) if is_executing_under_continuous_integration_server() else 6
    
        def __iter__(self):
            for sample_length in range(1, SamplesIterator.MAX_SAMPLE_LENGTH):
                combinations = [(FakeModuleNameGenerator(), FakeModule()) for i in range(0, sample_length)]
    
                for r in range(1, sample_length + 1):
                    logger.info("Generating sample in length %d with r=%d" % (sample_length, r))
                    yield itertools.combinations_with_replacement(combinations, r)
    
    
    def load_samples():
        if is_executing_under_continuous_integration_server() and os.getenv('USE_CACHES_SAMPLES', 'false') != 'true':
            list(itertools.chain.from_iterable(SamplesIterator()))
    
        import platform
    
        version = '%s.%s' % (
            sys.version_info[0], sys.version_info[1]) if platform.python_implementation() != 'PyPy' else 'pypy'
        samples_file = '%s%s' % (get_support_path(), 'modules_state.samples-%s' % version)
    
        if os.path.exists(samples_file) and os.path.getsize(samples_file) == 0 or not os.path.exists(samples_file):
            with open(samples_file, 'wb') as f:
                samples = list(itertools.chain.from_iterable(SamplesIterator()))
    
                try:
                    return samples
                finally:
                    pickle.dump(samples, f, pickle.HIGHEST_PROTOCOL)
        else:
            with open(samples_file, 'rb') as f:
                return pickle.load(f)
    

As you can see I am reading and writing in binary mode.

Here is the complete tox output for the same code before loading the list
(when the code is executed for the first time. After that the list is cached):

    
    
    /usr/bin/python2.7 /usr/local/bin/tox
    GLOB sdist-make: /home/omer/Documents/Projects/Python/nose2-testsuite/setup.py
    py26 inst-nodeps: /home/omer/Documents/Projects/Python/nose2-testsuite/.tox/dist/nose2-testsuite-0.1.0.zip
    py26 runtests: commands[0]
    .................................................................................................................................
    ----------------------------------------------------------------------
    Ran 129 tests in 0.034s
    
    OK
    py27 inst-nodeps: /home/omer/Documents/Projects/Python/nose2-testsuite/.tox/dist/nose2-testsuite-0.1.0.zip
    py27 runtests: commands[0]
    .................................................................................................................................
    ----------------------------------------------------------------------
    Ran 129 tests in 0.029s
    
    OK
    py33 inst-nodeps: /home/omer/Documents/Projects/Python/nose2-testsuite/.tox/dist/nose2-testsuite-0.1.0.zip
    py33 runtests: commands[0]
    .................................................................................................................................
    ----------------------------------------------------------------------
    Ran 129 tests in 0.034s
    
    OK
    pypy inst-nodeps: /home/omer/Documents/Projects/Python/nose2-testsuite/.tox/dist/nose2-testsuite-0.1.0.zip
    pypy runtests: commands[0]
    .................................................................................................................................
    ----------------------------------------------------------------------
    Ran 129 tests in 0.058s
    
    OK
    ___________________________________ summary ____________________________________
      py26: commands succeeded
      py27: commands succeeded
      py33: commands succeeded
      pypy: commands succeeded
      congratulations :)
    
    Process finished with exit code 0
    

We're all happy as everything works just fine right? Now when running tox
again here are the results:

    
    
    /usr/bin/python2.7 /usr/local/bin/tox
    GLOB sdist-make: /home/omer/Documents/Projects/Python/nose2-testsuite/setup.py
    py26 inst-nodeps: /home/omer/Documents/Projects/Python/nose2-testsuite/.tox/dist/nose2-testsuite-0.1.0.zip
    py26 runtests: commands[0]
    EE...........
    ======================================================================
    ERROR: tests.functional.test_isolators (nose2.loader.ModuleImportFailure)
    ----------------------------------------------------------------------
    ImportError: Failed to import test module: tests.functional.test_isolators
    Traceback (most recent call last):
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py26/lib/python2.6/site-packages/nose2/plugins/loader/discovery.py", line 188, in _find_tests_in_file
        module = util.module_from_name(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py26/lib/python2.6/site-packages/nose2/util.py", line 78, in module_from_name
        __import__(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/functional/test_isolators.py", line 14, in <module>
        for current_modules_state in load_samples():
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/common/support/isolators.py", line 63, in load_samples
        return pickle.load(f)
      File "/usr/lib/python2.6/pickle.py", line 1370, in load
        return Unpickler(file).load()
      File "/usr/lib/python2.6/pickle.py", line 858, in load
        dispatch[key](self)
      File "/usr/lib/python2.6/pickle.py", line 1083, in load_newobj
        obj = cls.__new__(cls, *args)
    TypeError: __new__() takes exactly 1 argument (2 given)
    
    
    ======================================================================
    ERROR: tests.unit.test_isolators (nose2.loader.ModuleImportFailure)
    ----------------------------------------------------------------------
    ImportError: Failed to import test module: tests.unit.test_isolators
    Traceback (most recent call last):
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py26/lib/python2.6/site-packages/nose2/plugins/loader/discovery.py", line 188, in _find_tests_in_file
        module = util.module_from_name(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py26/lib/python2.6/site-packages/nose2/util.py", line 78, in module_from_name
        __import__(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/unit/test_isolators.py", line 48, in <module>
        for current_modules_state in load_samples():
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/common/support/isolators.py", line 63, in load_samples
        return pickle.load(f)
      File "/usr/lib/python2.6/pickle.py", line 1370, in load
        return Unpickler(file).load()
      File "/usr/lib/python2.6/pickle.py", line 858, in load
        dispatch[key](self)
      File "/usr/lib/python2.6/pickle.py", line 1083, in load_newobj
        obj = cls.__new__(cls, *args)
    TypeError: __new__() takes exactly 1 argument (2 given)
    
    
    ----------------------------------------------------------------------
    Ran 13 tests in 0.002s
    
    FAILED (errors=2)
    ERROR: InvocationError: '/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py26/bin/nose2'
    py27 inst-nodeps: /home/omer/Documents/Projects/Python/nose2-testsuite/.tox/dist/nose2-testsuite-0.1.0.zip
    py27 runtests: commands[0]
    EE...........
    ======================================================================
    ERROR: tests.functional.test_isolators (nose2.loader.ModuleImportFailure)
    ----------------------------------------------------------------------
    ImportError: Failed to import test module: tests.functional.test_isolators
    Traceback (most recent call last):
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py27/local/lib/python2.7/site-packages/nose2/plugins/loader/discovery.py", line 188, in _find_tests_in_file
        module = util.module_from_name(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py27/local/lib/python2.7/site-packages/nose2/util.py", line 78, in module_from_name
        __import__(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/functional/test_isolators.py", line 14, in <module>
        for current_modules_state in load_samples():
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/common/support/isolators.py", line 63, in load_samples
        return pickle.load(f)
      File "/usr/lib/python2.7/pickle.py", line 1378, in load
        return Unpickler(file).load()
      File "/usr/lib/python2.7/pickle.py", line 858, in load
        dispatch[key](self)
      File "/usr/lib/python2.7/pickle.py", line 1083, in load_newobj
        obj = cls.__new__(cls, *args)
    TypeError: __new__() takes exactly 1 argument (2 given)
    
    
    ======================================================================
    ERROR: tests.unit.test_isolators (nose2.loader.ModuleImportFailure)
    ----------------------------------------------------------------------
    ImportError: Failed to import test module: tests.unit.test_isolators
    Traceback (most recent call last):
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py27/local/lib/python2.7/site-packages/nose2/plugins/loader/discovery.py", line 188, in _find_tests_in_file
        module = util.module_from_name(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py27/local/lib/python2.7/site-packages/nose2/util.py", line 78, in module_from_name
        __import__(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/unit/test_isolators.py", line 48, in <module>
        for current_modules_state in load_samples():
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/common/support/isolators.py", line 63, in load_samples
        return pickle.load(f)
      File "/usr/lib/python2.7/pickle.py", line 1378, in load
        return Unpickler(file).load()
      File "/usr/lib/python2.7/pickle.py", line 858, in load
        dispatch[key](self)
      File "/usr/lib/python2.7/pickle.py", line 1083, in load_newobj
        obj = cls.__new__(cls, *args)
    TypeError: __new__() takes exactly 1 argument (2 given)
    
    
    ----------------------------------------------------------------------
    Ran 13 tests in 0.002s
    
    FAILED (errors=2)
    ERROR: InvocationError: '/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py27/bin/nose2'
    py33 inst-nodeps: /home/omer/Documents/Projects/Python/nose2-testsuite/.tox/dist/nose2-testsuite-0.1.0.zip
    py33 runtests: commands[0]
    EE...........
    ======================================================================
    ERROR: tests.functional.test_isolators (nose2.loader.ModuleImportFailure)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/usr/lib/python3.3/unittest/case.py", line 385, in _executeTestPart
        function()
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py33/lib/python3.3/site-packages/nose2/loader.py", line 113, in testFailure
        raise exception
    ImportError: Failed to import test module: tests.functional.test_isolators
    Traceback (most recent call last):
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py33/lib/python3.3/site-packages/nose2/plugins/loader/discovery.py", line 188, in _find_tests_in_file
        module = util.module_from_name(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py33/lib/python3.3/site-packages/nose2/util.py", line 78, in module_from_name
        __import__(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/functional/test_isolators.py", line 14, in <module>
        for current_modules_state in load_samples():
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/common/support/isolators.py", line 63, in load_samples
        return pickle.load(f)
    TypeError: __new__() takes 1 positional argument but 2 were given
    
    
    ======================================================================
    ERROR: tests.unit.test_isolators (nose2.loader.ModuleImportFailure)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/usr/lib/python3.3/unittest/case.py", line 385, in _executeTestPart
        function()
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py33/lib/python3.3/site-packages/nose2/loader.py", line 113, in testFailure
        raise exception
    ImportError: Failed to import test module: tests.unit.test_isolators
    Traceback (most recent call last):
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py33/lib/python3.3/site-packages/nose2/plugins/loader/discovery.py", line 188, in _find_tests_in_file
        module = util.module_from_name(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py33/lib/python3.3/site-packages/nose2/util.py", line 78, in module_from_name
        __import__(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/unit/test_isolators.py", line 48, in <module>
        for current_modules_state in load_samples():
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/common/support/isolators.py", line 63, in load_samples
        return pickle.load(f)
    TypeError: __new__() takes 1 positional argument but 2 were given
    
    
    ----------------------------------------------------------------------
    Ran 13 tests in 0.002s
    
    FAILED (errors=2)
    ERROR: InvocationError: '/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/py33/bin/nose2'
    pypy inst-nodeps: /home/omer/Documents/Projects/Python/nose2-testsuite/.tox/dist/nose2-testsuite-0.1.0.zip
    pypy runtests: commands[0]
    EE...........
    ======================================================================
    ERROR: tests.functional.test_isolators (nose2.loader.ModuleImportFailure)
    ----------------------------------------------------------------------
    ImportError: Failed to import test module: tests.functional.test_isolators
    Traceback (most recent call last):
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/pypy/site-packages/nose2/plugins/loader/discovery.py", line 188, in _find_tests_in_file
        module = util.module_from_name(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/pypy/site-packages/nose2/util.py", line 78, in module_from_name
        __import__(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/functional/test_isolators.py", line 14, in <module>
    ERROR: InvocationError: '/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/pypy/bin/nose2'
        for current_modules_state in load_samples():
    ___________________________________ summary ____________________________________
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/common/support/isolators.py", line 63, in load_samples
    ERROR:   py26: commands failed
        return pickle.load(f)
    ERROR:   py27: commands failed
      File "/usr/lib/pypy/lib-python/2.7/pickle.py", line 1421, in load
    ERROR:   py33: commands failed
        return Unpickler(file).load()
    ERROR:   pypy: commands failed
      File "/usr/lib/pypy/lib-python/2.7/pickle.py", line 901, in load
        dispatch[key](self)
      File "/usr/lib/pypy/lib-python/2.7/pickle.py", line 1126, in load_newobj
        obj = cls.__new__(cls, *args)
    TypeError: __new__() takes exactly 1 argument (2 given)
    
    
    ======================================================================
    ERROR: tests.unit.test_isolators (nose2.loader.ModuleImportFailure)
    ----------------------------------------------------------------------
    ImportError: Failed to import test module: tests.unit.test_isolators
    Traceback (most recent call last):
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/pypy/site-packages/nose2/plugins/loader/discovery.py", line 188, in _find_tests_in_file
        module = util.module_from_name(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/.tox/pypy/site-packages/nose2/util.py", line 78, in module_from_name
        __import__(name)
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/unit/test_isolators.py", line 48, in <module>
        for current_modules_state in load_samples():
      File "/home/omer/Documents/Projects/Python/nose2-testsuite/tests/common/support/isolators.py", line 63, in load_samples
        return pickle.load(f)
      File "/usr/lib/pypy/lib-python/2.7/pickle.py", line 1421, in load
        return Unpickler(file).load()
      File "/usr/lib/pypy/lib-python/2.7/pickle.py", line 901, in load
        dispatch[key](self)
      File "/usr/lib/pypy/lib-python/2.7/pickle.py", line 1126, in load_newobj
        obj = cls.__new__(cls, *args)
    TypeError: __new__() takes exactly 1 argument (2 given)
    
    
    ----------------------------------------------------------------------
    Ran 13 tests in 0.004s
    
    FAILED (errors=2)
    
    Process finished with exit code 1
    


Answer: I found it!

The problem was here:

    
    
    class FakeModuleNameGenerator(str):
        @classmethod
        def __new__(cls, *args, **kwargs):
            return str(binascii.b2a_hex(os.urandom(15)))
    

Since this inherits from str, `__new__` has to accept another argument. Doh!

