Coder Social home page Coder Social logo

python_koans's Introduction

Python Koans

image

image

image

One click installation:

image

  or

image

Python Koans is a port of Edgecase's "Ruby Koans" which can be found at http://rubykoans.com/.

image

Python Koans is an interactive tutorial for learning the Python programming language by making tests pass.

Most tests are fixed by filling the missing parts of assert functions. Eg:

self.assertEqual(__, 1+2)

which can be fixed by replacing the __ part with the appropriate code:

self.assertEqual(3, 1+2)

Occasionally you will encounter some failing tests that are already filled out. In these cases you will need to finish implementing some code to progress. For example, there is an exercise for writing some code that will tell you if a triangle is equilateral, isosceles or scalene.

As well as being a great way to learn some Python, it is also a good way to get a taste of Test Driven Development (TDD).

Downloading Python Koans

Python Koans is available on GitHub:

You can clone with Git or download the source as a zip/gz/bz2.

Installing Python Koans

Aside from downloading or checking out the latest version of Python Koans, you need to install the Python interpreter.

At this time of writing, we support Python 3. The policy is to try to keep current with the latest production version.

You should be able to work with newer Python versions, but older ones will likely give you problems.

You can download Python from here:

After installing Python make sure the folder containing the python executable is in the system path. In other words, you need to be able to run Python from a command console. It will either be python3 or for Windows it will be python.exe.

If you have problems, this may help:

Windows users may also want to update the line in the batch file run.bat to set the python path:

SET PYTHON_PATH=C:\Python39

Getting Started

Jake Hebbert has created a couple of screencasts available here:

https://www.youtube.com/watch?v=e2WXgXEjbHY&list=PL5Up_u-XkWgNcunP_UrTJG_3EXgbK2BQJ&index=1

Or if you prefer to read:

From a *nix terminal or Windows command prompt run:

.. code-block:: sh

python contemplate_koans.py

or:

python3 contemplate_koans.py

In my case I'm using Python 3 with Windows, so I fire up my command shell (cmd.exe) and run this:

image

Apparently a test failed:

AssertionError: False is not True

It also tells me exactly where the problem is, it's an assert on line 12 of .\\koans\\about_asserts.py. This one is easy, just change False to True to make the test pass.

Sooner or later you will likely encounter tests where you are not sure what the expected value should be. For example:

class Dog:
    pass

def test_objects_are_objects(self):
    fido = self.Dog()
    self.assertEqual(__, isinstance(fido, object))

This is where the Python Command Line can come in handy. In this case I can fire up the command line, recreate the scenario and run queries:

image

Sniffer Support

Sniffer allows you to run the tests continuously. If you modify any files files in the koans directory, it will rerun the tests.

To set this up, you need to install sniffer:

python3 -m pip install sniffer

You should also run one of these libraries depending on your system. This will automatically trigger sniffer when a file changes, otherwise sniffer will have to poll to see if the files have changed.

On Linux:

python3 -m pip install pyinotify

On Windows:

python3 -m pip install pywin32

Also available here:

https://github.com/mhammond/pywin32/releases

On macOS:

python3 -m pip install MacFSEvents

Once it is set up, you just run:

sniffer

Just modify one of the koans files and you'll see that the tests are triggered automatically. Sniffer is controlled by scent.py.

Getting the Most From the Koans

Quoting the Ruby Koans instructions:

"In test-driven development the mantra has always been, red, green, refactor. Write a failing test and run it (red), make the test pass (green), then refactor it (that is look at the code and see if you can make it any better). In this case you will need to run the koan and see it fail (red), make the test pass (green), then take a moment and reflect upon the test to see what it is teaching you and improve the code to better communicate its intent (refactor)."

Finding More Koan Projects

There are number of other great Koan projects out there for various languages and frameworks. Most of them can be found in GitHub. Also there is a little koans activity on Bitbucket.

Translations

Translations are always welcome! Feel free to add one to this README if you happen to work on one:

https://github.com/mswell/python_koans_br

Acknowledgments

Thanks go to Jim Weirich and Joe O'Brien for the original Ruby Koans that the Python Koans is based on! Also the Ruby Koans in turn borrows from Metakoans so thanks also go to Ara Howard for that!

Also thanks to everyone who has contributed to Python Koans! I got a great headstart by taking over a code base initiated by the combined Mikes of FPIP. So here's a little plug for their very cool Python podcast:

A big thanks also to Mike Pirnat @pirnat and Kevin Chase @kjc have pitched in as co-maintainers at various times

python_koans's People

Contributors

ab7 avatar adityagupta679 avatar akshaydandekar avatar brainwane avatar brootware avatar chuntaolu avatar ciceropablo avatar cliftonmcintosh avatar dominiqueplante avatar endenis avatar flopezluis avatar gregmalcolm avatar hugovk avatar icmurray avatar jimmy878787 avatar johnistan avatar karptonite avatar kissgyorgy avatar kjc avatar matt-deacalion avatar mikelietz avatar mpirnat avatar newevolution avatar noloman avatar ryan1729 avatar santosh avatar skiggety avatar thibaudcolas avatar tracybporter avatar viprs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python_koans's Issues

I find Dog2 in about class attributes misleading

The tests after the class (python3/koans/about_class_attributes.py 77-90) seem to imply that when one uses the @staticmethod and @classmethod some how override the instance methods. Especially the test test_staticmethods_also_overshadow_instance_methods makes me think that. However when I change the order to declare the instance methods bark(self) and growl(self) after the other two with the same names the opposite happens. That is the instance methods override the class and static ones.
eg.

class Dog2:
    def wag(self):
        return 'instance wag'

    @staticmethod
    def bark():
        return "staticmethod bark, arg: None"

    @classmethod
    def growl(cls):
        return "classmethod growl, arg: cls=" + cls.__name__

    def bark(self):
        return "instance bark"

    def growl(self):
        return "instance growl"

def test_since_classes_are_objects_you_can_define_singleton_methods_on_them_too(self):
    self.assertRegexpMatches(self.Dog2().growl(), 'instance growl')

def test_classmethods_are_not_independent_of_instance_methods(self):
    fido = self.Dog2()
    self.assertRegexpMatches(fido.growl(), 'instance growl')
    self.assertRegexpMatches(self.Dog2().growl(), 'instance growl')

def test_staticmethods_are_unbound_functions_housed_in_a_class(self):
    self.assertRegexpMatches(self.Dog2().bark(), 'instance bark')

def test_staticmethods_also_overshadow_instance_methods(self):
    fido = self.Dog2()
    self.assertRegexpMatches(fido.bark(), 'instance bark')

Am I the only person to get the wrong message by this?

[python3] about_sets.py

a comment says # Note: Sets have only started using braces since Python 3, however, set literal syntax was backported to python 2.7.

I can make a pull request to update this comment if that's ok.

How to with Koans?

I am sure you must not have heard this kind of question, and I assume its been pretty long for you had seen the code as well.

I have cloned the python_koans github repository and started working on it. From the documentation what I learnt it change in the file to the appropriate value and make the test pass.

Well it did seemed very simple at first, but once i stated to move again ahead with the koans i found that merely replacing the empty fields with the variable defined in the test solves the issue, which sounded pretty simple to me and I see there I am not learning anything new or programatic in doing such thing. Hence, I felt that may be what I am doing is not right and come to you to ask, if thats what is to be done, or shall we write any code to make it success. Please advise.

for eg.

def test_plus_will_not_modify_original_strings(self):
    hi = "Hello, "
    there = "world"
    string = hi + there
    self.assertEqual(___ , hi)
    self.assertEqual(___ , there)

This will fail, but if I add

def test_plus_will_not_modify_original_strings(self):
    hi = "Hello, "
    there = "world"
    string = hi + there
    self.assertEqual(hi , hi)
    self.assertEqual(there , there)

This is success. Is this what is to be done?

Change test_instances_of_classes_can_be_created_adding_parentheses koan

The current test is:

self.assertEqual(__, fido.__class__)

I'm assuming that this would have worked previous versions, but python gives the warning.

AssertionError: '-=> FILL ME IN! <=-' != <class 'koans.about_classes.AboutClasses.Dog'>

I think the test should be.

self.assertRegexpMatches(fido.__class__, __)

Triangle2 koan

Isn't 2, 4, 2 a valid triangle? Since any two of the sides can be added and will be greater than or equal to the remaining side.

Make Koans PEP8 compliant?

This is not a super issue, but I noticed that there are small things (indentations, spaces, names) that are not PEP8 compliant. I noticed this in the Python3 folder (Had not checked the Python2 folder)

Update to Colorama 0.2.7

I am not sure why the version of Colorama that is currently used fails because it is fairly random, but I get the following exception. Dropping Colorama 0.2.7 into the libs folder fixes it.

Traceback (most recent call last):
File "contemplate_koans.py", line 37, in
Mountain().walk_the_path(sys.argv)
File "D:\python_koans\python2\runner\mountain.py", line 24, in walk_the_path
self.tests(self.lesson)
File "C:\Python27\lib\unittest\suite.py", line 70, in call
return self.run(_args, *_kwds)
File "C:\Python27\lib\unittest\suite.py", line 108, in run
test(result)
File "C:\Python27\lib\unittest\case.py", line 395, in call
return self.run(_args, *_kwds)
File "C:\Python27\lib\unittest\case.py", line 370, in run
result.addSuccess(self)
File "D:\python_koans\python2\runner\sensei.py", line 45, in addSuccess
Fore.RESET, Style.NORMAL))
File "D:\python_koans\python2\runner\writeln_decorator.py", line 17, in writeln
if arg: self.write(arg)
File "D:\python_koans\python2\libs\colorama\ansitowin32.py", line 34, in write
self.__convertor.write(text)
File "D:\python_koans\python2\libs\colorama\ansitowin32.py", line 115, in write
self.write_and_convert(text)
File "D:\python_koans\python2\libs\colorama\ansitowin32.py", line 140, in write_and_convert
self.convert_ansi(_match.groups())
File "D:\python_koans\python2\libs\colorama\ansitowin32.py", line 154, in convert_ansi
self.call_win32(command, params)
File "D:\python_koans\python2\libs\colorama\ansitowin32.py", line 175, in call_win32
func(_args, **kwargs)
File "D:\python_koans\python2\libs\colorama\winterm.py", line 48, in fore
self.set_console(on_stderr=on_stderr)
File "D:\python_koans\python2\libs\colorama\winterm.py", line 68, in set_console
win32.SetConsoleTextAttribute(handle, attrs)
File "D:\python_koans\python2\libs\colorama\win32.py", line 66, in SetConsoleTextAttribute
assert success
AssertionError

about_classes.py in answers branch has a different definition of Dog6 then the question

There doesn't seem to be an indication that you should rewrite it to get past koans that depend on it.

Original definition

    class Dog6:
        def __init__(self, initial_name):
            self._name = initial_name

        def get_self(self):
            return self

        def __str__(self):
            return __

        def __repr__(self):
            return "<Dog named '" + self._name + "'>"

Definition in answers (I'm cheating!)

    class Dog6:
        def __init__(self, initial_name):
            self._name = initial_name

        def get_self(self):
            return self

        def __str__(self):
            return self._name
#####            return __

        def __repr__(self):
            return "<Dog named '" + self._name + "'>"

Not trying to nitpick.

Subfolders without an init moduler

As of Python 3.3 the:
test_subfolders_without_an_init_module_are_not_part_of_the_package
koan doesn't raise any exception. You'd want to change the code to:

with self.assertRaises(____): 
     from a_normal_folder import Duck

to force the Error.

about_triangle_project2.py unclear

On lines 18 and 19:

self.assertNotRaises(TriangleError, triangle, 1, 1, 3)
self.assertNotRaises(TriangleError, triangle, 2, 5, 2)

I don't understand why those are considered invalid triangles. The fact that there is a valid type of triangle called "scalene" means that it can't be because they aren't valid right angle triangles.

The fact they don't conform to Pythagoras Theorem is the only thing I can think of.

I don't think about_proxy_object_project.py works in python3

I even went to the answers branch and copied the first part of the file over annd it didn't seem to work. It just gave me a stack trace.

Thinking AboutProxyObjectProject
  test_proxy_method_returns_wrapped_object has damaged your karma.

You have not yet reached enlightenment ...
  RuntimeError: maximum recursion depth exceeded

Please meditate on the following code:
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 47, in test_proxy_method_returns_wrapped_object
    tv = Proxy(Television())
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 23, in __init__
    self._messages = list()
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 35, in __setattr__
    return object.__setattr__(self._obj, attr_name, attr_value)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)
  File "/Users/mandaris/Virtualenvs/koans/Tests/python3/koans/about_proxy_object_project.py", line 29, in __getattr__
    temp = getattr(self._obj, name)

Please advise.

Question in about_methods.py in python3

Thinking AboutMethods
  test_calling_a_global_function has expanded your awareness.
  test_calling_functions_with_wrong_number_of_arguments has damaged your karma.

You have not yet reached enlightenment ...
  AssertionError: Regex didn't match: 'my_global_function\\(\\) takes exactly 2 arguments \\(0 given\\)' not found in "my_global_function() missing 2 required positional arguments: 'a' and 'b'"

I don't think that the koans have been updated for changes in python.

[python3] about_iteration.py

So there's this function in about_iteration.py which is supposed to calculate a number from the Fibonacci sequence, judging from the name of the variable. But instead it just adds up the numbers in range (1,6):

def test_iterators_are_a_type(self):
    it = iter(range(1,6))

    fib = 0

    for num in it:
        fib += num

    self.assertEqual(__ , fib)

So fib = 0 + 1 + 2 + 3 + 4 + 5 = 15

One question regards to about_none.py

Hi Everyone,

I have got a question while I was doing python_koans myself.
So, here it goes. In about_none.py file, around line 45
I do not get why both
self.assertMatch('NoneType', ex.args[0])
self.assertMatch('None', ex.args[0])
are passed, any explanation will be appreciated.

Lin

Length of string

Hi, I'd like to ask what is the intended solution to this task:

    def test_use_backslash_at_the_end_of_a_line_to_continue_onto_the_next_line(self):
        string = "It was the best of times,\n\
It was the worst of times."
        self.assertEqual(__, len(string))

Should one count the letters one-by-one and then put there "52"?

I can't figure out any better solution.

Thanks in advance!

Python 3/koans/about_lists.py Typo

I believe the comment on line 109 of Python 3/koans/about_lists.py should say:

# This is not an issue for Python 3 though

rather than (what it currently says):

# This is not as issue for Python 3 through

cube_me squares

in koans/about_generators.py, the function cube_me actually squares.

def cube_me(self, seq):
for x in seq:
yield x * x

AboutWithStatements.test_finding_lines2 (Python3 version) --- assertNotEqual passes as-is

Quoting @denis-roy's pull request #157, regarding the Python 3 version of AboutWithStatements.test_finding_lines2:

The default placeholder value of __ can be left as is and the test will pass.

And from his comment in the file itself:

[...] In fact it accepts anything that is not 'test\n' as an answer.

The Python 2 version of the same test explicitly asserts that the user-written function does not return None:

def find_line2(self, file_name):
    # Rewrite find_line using the Context Manager.
    pass

def test_finding_lines2(self):
    self.assertEqual(__, self.find_line2("example_file.txt"))
    self.assertNotEqual(None, self.find_line2("example_file.txt"))

I think the idea was that the assertNotEqual would test that the student-written function returns anything, while the assertEqual would test that furthermore the return value is correct. That would be more clear if:

  1. The general test appeared before the specific test.

...and maybe:

  1. They both asserted the expected value.

Something like:

def test_finding_lines2(self):
    self.assertNotEqual(None, self.find_line2("example_file.txt"))
    self.assertEqual("test\n", self.find_line2("example_file.txt"))

This should focus the student's attention entirely on rewriting find_line2.

I'm having trouble with the about_none tests

I'm having trouble getting through these tests. I'm having trouble googling information about the none object outside of the original documentation.

Could someone point me in the right direction? How many of you have done those test recently? Would it make more since to have them later in set of tests because I was flying through the first part of simple asserts and I don't know how much of this will affect the rest of the tests.

The test suite that tests the tests (...yeah) fails

If I run the _“runner_tests.py” (both Python2 and Python3) it fails on 5 tests.

  • test_that_end_report_displays_something
  • test_that_end_report_should_have_something_zenlike_on_it
  • test_that_end_report_shows_student_progress
  • test_that_end_report_shows_the_failure_report
  • test_filter_all_lessons_will_discover_test_classes_if_none_have_been_discovered_yet

-1 lessons away from enlightenment in python2 koans

Still have regex to do (maybe more) and this is what's displaying

...

Thinking TelevisionTest
test_can_set_the_channel has expanded your awareness.
test_edge_case_on_off has expanded your awareness.
test_it_also_turns_off has expanded your awareness.
test_it_turns_on has expanded your awareness.

Thinking AboutExtraCredit
test_extra_credit_task has expanded your awareness.

Thinking AboutRegex
test_matching_literal_text has damaged your karma.

You have not yet reached enlightenment ...
AssertionError: I want my name

Please meditate on the following code:
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_regex.py", line 27, in test_matching_literal_text

You have completed 297 koans and 39 lessons.
You are now 6 koans and -1 lessons away from reaching enlightenment.

Explicit is better than implicit.

test_dice_values_should_change_between_rolls

This test assigns to two variables, first_time and second_time:

dice.roll(5)
first_time = dice.values

dice.roll(5)
second_time = dice.values

But since these are both reference assignments doesn't that mean that the test will necessarily fail no matter how one implements the roll() method?

Strange test names in about_generators.py

Two of the names of the tests in about_generators.py seem a little off. Specifically:

  1. test_coroutines_can_take_arguments: The test here seems to have nothing to do with generators as coroutines, and additionally coroutines haven't been introduced yet. Not sure what the name should be though.
  2. test_generators_can_take_coroutines: It seems the generator here isn't /taking/ a coroutine, but rather it is a coroutine. Perhaps something like test_generators_are_also_coroutines?

about_new_style_classes error

Now in python2/koans/about_new_style_classes.py, line 37 i see:
def test_old_style_classes_have_type_but_no_class_attribute(self):
self.assertEqual(, self.OldStyleClass.__class)

I think that it's an error here. Either we you should use assertRaises here or NewStyleClass.

about_triangle_project2.py

Hi

I have added the code into triangle.py - and saved it!

def triangle(a, b, c):
    # DELETE 'PASS' AND WRITE THIS CODE
    #pass
    def triangle(a, b, c):
        if a <= 0 or b <= 0 or c <= 0:
            raise TriangleError(AttributeError('Negative edge is not allowed'))
        if a + b + c <= 2 * max(a, b, c):
            raise TriangleError(AttributeError('largest side should be smaller than sum of 2 other sides'))
        if a == b == c:
            return 'equilateral'
        elif a == b or b == c or c == a:
            return 'isosceles'
        return 'scalene'

# Error class used in part 2.  No need to change this code.
class TriangleError(Exception):
    pass

When I run the contemplate_koans.py I get the following error and I'm struggling to work out what is wrong.

I get "AssertionError: TriangleError not raised" on the line that calls triangle in about_triangle_project2.py the line is triangle(0, 0, 0)

Can you help me?

question about test_that_unittest_asserts_work_the_same_way_as_python_asserts

Thanks for creating these koans. If you have the time, I'm a little curious about the difference between "unit test asserts" and "python asserts."

I just realized that you have a bunch of calls to self.assertTrue, but assertTrue isn't actually defined anywhere within about_asserts.py nor does the class in that file inherit from anything. So I can't figure out where self.assertTrue would be coming from.

I'm guessing, though, that self.assertTrue is somehow the "unit test assert" whereas the bare assert is the Python assert. But it would be nice to get confirmation.

python2 - about_attribute_access.py - Infinite loop

There seems to be a bug on line 109/110.

When I "Uncomment for debugging info" and run contemplate_koans.py it gets stuck in a loop:

You have not yet reached enlightenment ...
RuntimeError: maximum recursion depth exceeded while calling a Python object

Please meditate on the following code:
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 131, in test_getattribute_is_a_bit_overzealous_sometimes
catcher.my_method()
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute
File "/home/tom/Dropbox/Misc Coding/python_koans/python2/koans/about_attribute_access.py", line 110, in getattribute

adding-progress-percentage to sensei's teachings

Hey, @gregmalcolm and mates!

I've created a branch in my station and made a very little commit here showing the percentage of lessons done and the total of lessons right after the lessons done.

And just wanted to know if you prefer I fork your project then you could incorporate my suggestion I added, or may I be part of the contributors of this repository to send my pull request?

Big hug!

ps: maybe I'm rebooting my technical life, starting from scratch with python development, so I wanted to give you this context and see if you take this risk ;-P

sum_it uninteresting

In koans/about_generators.py, the function sum_it is uninteresting. It would be much better if it was:

def sum_it(self, seq):
    value = 0
    for num in seq:
        # The local state of 'value' will be retained between iterations
        value += num
        yield value # the yield is now inside the for

Question about tuples

In the following test in about_tuples.py

    def test_tuples_of_one_look_peculiar(self):
        self.assertEqual(int, (1).__class__)
        self.assertEqual(tuple, (1,).__class__)
        self.assertEqual(__, ("Hello comma!", ))

Should the last statment be

self.assertEqual(__, ("Hello comma!", ).__class__)

Koan sequence in Python2 (trivial)

Not a bug, more of a nitpick or cavil

In using "python2 contemplate_koans py", test_triple_single_quotes_work_too (about_strings.py - line 21) is followed by test_use_single_quotes_to_create_string_with_double_quotes (about_strings.py - line 29) , skipping over test_raw_strings_are_also_strings (about_strings.py - line 25).

The test_raw_strings_are_also_strings (about_strings.py - line 25) is then performed next.

Ambiguous requirement in python2 koans about_attribute_access.py

on line 186 of about_attribute_access.py in class PossessiveSetter:

def test_setattr_intercepts_attribute_assignments(self):
      fanboy = self.PossessiveSetter()

      fanboy.comic = 'The Laminator, issue #1'
      fanboy.pie = 'blueberry'

      self.assertEqual('blueberry', fanboy.a_pie)

      prefix = '__'
      self.assertEqual(
           "The Laminator, issue #1",
            getattr(fanboy, prefix + '_comic'))

The requirement is unclear. Changing the value of the variable 'prefix' causes a successful koan, but this is not uniform with how the other koans are changed. An instruction here might be helpful.

Nice work. Thank you.

python2 about_new_style_classes tries __class__ instead of type

The test with an issue claims that it is showing that type exists but not the class attribute. The first line of the test method fails with an AttributeError.

    def test_old_style_classes_have_type_but_no_class_attribute(self):
        self.assertEqual(__, self.OldStyleClass.__class__)

        try:
            cls = self.OldStyleClass.__class__
        except Exception as ex:
            pass

        self.assertMatch(__, ex[0])

Here is the output from this failure:

You have not yet reached enlightenment ...
  AttributeError: class OldStyleClass has no attribute '__class__'

Please meditate on the following code:
  File "/Users/aron/dev/python_koans/python2/koans/about_new_style_classes.py", line 37, in test_old_style_classes_have_type_but_no_class_attribute
    self.assertEqual(__, self.OldStyleClass.__class__)

If you call type(OldStyleClass), you get <type 'classobj'>, which is something that hasn't been introduced in earlier koans. Maybe convert this check into:

        self.assertEqual(__, str(type(self.OldStyleClass)))

This way, the student needs to document the name of the type as a string instead of worrying about ClassType inside the types module or any other way of creating the classobj type.

Python version:

Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin

Clarity and intent problems in `about_regex.py`

I noticed that the about_regex.py koans are at the very bottom of the "Path to Enlightenment", after even the extra credit (in the python[23]/koans.txt files I created, and in the test runners before them). Was that supposed to be a hint that it's not ready for prime time?

I ran into several problems with the koans in AboutRegex, and I often couldn't figure out what the author's intent was. (I gather it wasn't @gregmalcolm.) The author credits SAMS Teach Yourself Regular Expressions in 10 Minutes by Ben Forta for inspiring the module. I don't have that book, but it might not help anyway --- presumably the koans aren't just copies of the book's examples.

I guess I'm mostly asking if the original author (Felix?) is still around, and if not, what your plan is for this module?

(I've submitted #159 to make comparing the Python 2 and Python 3 versions of about_regex.py easier. Turns out, they're identical after all Python 2 fixes are applied to the Python 3 version.)

A few examples of things I want to fix (line numbers taken from the Python 2 file):

Lines 46--52

I think the intent of test_matching_literal_text_how_many is for the user to replace re.match(...) with something like len(re.findall(...)). But the assertion has the user typing something that will evaluate equal to a match object.

As written, the __ should be replaced with None, which might be what the "tip" is trying to say. But that contradicts the other comment that asks for how many times the name 'Felix' appears, which would be a number.

def test_matching_literal_text_how_many(self):
    ...
    string = ("Hello, my name is Felix and these koans are based " +
        "on Ben's book: Regular Expressions in 10 minutes. " +
        "Repeat My name is Felix")
    m = re.match('Felix', string)  # TIP: match may not be the best option

    # I want to know how many times my name appears
    self.assertEqual(m, __)

If the goal is to fix the function called, then the assertion should be complete:

    # I want to know how many times my name appears.
    # TIP: match may not be the best function for the job.
    matches = re.match('Felix', string)
    count = len(matches)
    self.assertEqual(count, 2)

If the goal is to fill in the assertion with None, then the second comment is wrong. (Also, this koan won't teach much.)

Maybe there should be two koans, this one and something like test_failed_matches_return_none()?

Line 83

There is no myArray variable in test_matching_any_character, and it doesn't occur in the string we're given to search. What did the author mean here?

change_this_search_string = 'a..xlx' # <-- I want to find all uses of myArray

Lines 85--87

Making the assertion in test_matching_any_character pass has almost nothing to do with the . character or what it matches. The real problem is the typo in the regex: 'a..xlx' should be 'a..xls'.

(Note that the first . in this regex will match a variety of digits, while the second will by chance only match periods... This will almost certainly confuse beginners.)

Lines 89--113

test_matching_set_character is looking for the wrong answer. There are four files that match, not 3.

# I want to find all files for North America(na) or South
# America(sa), but not (ca) TIP you can use the pattern .a.
# which matches in above test but in this case matches more than
# you want
change_this_search_string = r'[nsc]a[2-9]\.xls'
self.assertEquals(
    len(re.findall(change_this_search_string, string)),
    3)  # <----=  Should be 4, not 3.

Maybe he specifically wants only the '1' version of each file? If so, then the solution is to entirely remove the character set and replace it with the literal '1'... which is a weird solution for the koan that introduces character sets.

Also, what "above test" is that "tip" talking about? There was no '.a.' in test_matching_any_character.

Lines 115--140

test_anything_but_matching has nothing to do with character sets, negated or otherwise... The string 'am' appears exactly once in the input, so there's nothing to filter out. Once again, the solution is to remove the supposed subject.

def test_anything_but_matching(self):
    # ...
    # I want to find the name sam
    change_this_search_string = '[^nc]am'
    self.assertEquals(
        re.findall(change_this_search_string, string),
        ['sam.xls'])

The claim in the comments ("I want to find the name 'sam'") is wrong --- he wants to find exactly one filename, 'sam.xls', which doesn't even require a regex... Windows' Ctrl-F could solve this one.

Python 3 - About Multiple Inheritance

Hi, I'm learning python. I encounter the following problem at line 69 in koans_about_multiple_inheritance:
super(AboutMultipleInheritance.Nameable, self).__init__()
doesn't make sense, because in MRO order, after "Nameable" is "object".

Possible to hide the correct answer?

Thank you for this great educational tool!

When I see failing test output like this:

You have not yet reached enlightenment ...
  AssertionError: '-=> FILL ME IN! <=-' != 0

…well, I know the answer is 0, and for the sake of my learning, that value is hard to "un-see." Is there anyway to hide it?

Stopped working after some time ( python3 )

While i was working on a about_strings, i got stuck on escaping double quotes / triple quotes, and the whole thing just stopped working ? when i run run.sh i get this :

Traceback (most recent call last):
  File "contemplate_koans.py", line 35, in <module>
    Mountain().walk_the_path(sys.argv)
  File "/home/noirchrome/python_koans/python3/runner/mountain.py", line 14, in __init__
    self.tests = path_to_enlightenment.koans()
  File "/home/noirchrome/python_koans/python3/runner/path_to_enlightenment.py", line 62, in koans
    return koans_suite(names)
  File "/home/noirchrome/python_koans/python3/runner/path_to_enlightenment.py", line 51, in koans_suite
    tests = loader.loadTestsFromName(name)
  File "/usr/lib/python3.6/unittest/loader.py", line 153, in loadTestsFromName
    module = __import__(module_name)
  File "/home/noirchrome/python_koans/python3/koans/about_strings.py", line 93
    self.assertEqual("""\n""", string)
                                     ^
SyntaxError: unexpected character after line continuation character

Unused data in a test_sensei.py test (Python 2 and 3).

Unused variable expected in both versions of test_sensei.py, in the test_that_nothing_is_returned_as_sorted_result_if_there_are_3_shuffled_results method. It's a list of tuples that look like they should have been used in the assertions --- something like self.assertEqual(expected, results), maybe? I'll leave that change to someone who already knows what the intent was.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.