Because the name was kind of available and there was the idea to have the package evolve into a "standard" library kind of thing that works cross-python versions and is not tied to a particular CPython revision or its release cycle. Clearly, this was ambitious and the naming has maybe haunted the project rather than helping it. There may be a project name change and possibly a split up into different projects sometime.
the py lib contains other command line tools that all share the py. prefix which makes it easy to use TAB-completion on the shell. Another motivation was to make it obvious where testing functionality for the py.test command line tool is: in the py.test package name space.
py.test and nose share basic philosophy when it comes to running Python tests. In fact, with py.test-1.0.1 it is easy to run many test suites that currently work with nosetests. nose was created as a clone of py.test when it was in the 0.8 release cycle so some of the newer features introduced with py.test-1.0 have no counterpart in nose.
"All this magic" usually boils down to two issues:
Other than that, py.test has bugs or quirks like any other computer software. In fact, it has a strong focus on running robustly and has over a thousand automated tests for its own code base.
When experimenting with funcargs an explicit registration mechanism was considered. But lacking a good use case for this indirection and flexibility we decided to go for Convention over Configuration and allow to directly specify the factory. Besides removing the need for an indirection it allows to "grep" for pytest_funcarg__MYARG and will safely find all factory functions for the MYARG function argument. It helps to alleviates the de-coupling of function argument usage and creation.
There are two reasons why yielding from a factory function is not possible:
Use the pytest_generate_tests hook to solve both issues and implement the parametrization scheme of your choice.