[Biopython] type object 'RestrictionType' has no attribute 'size'

Wibowo Arindrarto w.arindrarto at gmail.com
Thu Dec 5 10:01:04 UTC 2013


Hi everyone,

Christopher: Ah yes, I actually meant the IPython notebook (but I
guess it turns out the same occurs in the IPython console then :) ).

Antony: That may be the case, too. But thanks for the pull request (I
think Peter has just looked at it, actually
https://github.com/biopython/biopython/pull/148). I do think there is
room for improvement there, especially since the code probably
predates modern Python conventions (& assumptions).

Cheers,
Bow

On Thu, Dec 5, 2013 at 4:38 AM, Antony Lee <antony.lee at berkeley.edu> wrote:
> The restriction code does *way* more magic with metaclasses than needed (and
> I don't think IPython is really to blame here as the code breaks some fairly
> basic assumptions about the Python object model IMHO).  I have in fact a PR
> from nearly one year ago that basically reimplemented the whole module from
> scratch (https://github.com/biopython/biopython/pull/148).  Feel free to try
> it.
>
> Antony
>
>
> 2013/12/4 Christopher J Friedline <cfriedline at vcu.edu>
>>
>> I may have spoken too soon about the notebook specificity - got the same
>> error when I run .full() on the Analysis object in the ipython console.
>>
>> On Wed, Dec 4, 2013 at 8:53 PM, Christopher J Friedline
>> <cfriedline at vcu.edu>wrote:
>>
>> > Bow,
>> >
>> > Thanks for your excellent reply and for taking the time to look - it
>> > never
>> > occurred to me to use the regular (or IPython) REPL - because it's just
>> > not
>> > my way of developing.  I think you're right about it not being a
>> > Biopython
>> > bug, but I think the problems are related to the IPython notebook
>> > specifically, rather than IPython, in general.  I downloaded the
>> > notebook
>> > and ran it in the ipython console (%run magic), and it completes without
>> > error.  Good catch - I'll touch base with the IPython folks.
>> >
>> > Thanks,
>> > Chris
>> >
>> >
>> >
>> > On Wed, Dec 4, 2013 at 7:03 PM, Wibowo Arindrarto
>> > <w.arindrarto at gmail.com>wrote:
>> >
>> >> Hi Christopher, Peter,
>> >>
>> >> Thank you for reporting the issue. After prodding around, I have to
>> >> say this looks like a very interesting 'bug' :). I'm going to ramble a
>> >> bit below, so I'll give a short TL;DR first:
>> >>
>> >> I don't think this is a bug from Biopython per se, since if you try
>> >> the same code in a regular Python shell, it works (as Peter has
>> >> shown). Don't get me wrong,
>> >> I do appreciate the report in IPython notebook form (I'm a user myself
>> >> and I think more people should use it, also for reporting bugs like
>> >> this). But in the context of fixing the problem, I'd suggest that you
>> >> use a regular Python shell instead.
>> >>
>> >> Now, that being said, let's delve in a bit into what's causing the bug
>> >> (with a small disclaimer: these are my observations and I'm quite sure
>> >> there are others who know more about this issue).
>> >>
>> >> If you see the stack
>> >> trace of the error, you'd see that a huge chunk is coming from the
>> >> IPython codebase. Initially I thought this was something of an
>> >> artifact (I expected the entire stack to trace only Biopython code),
>> >> but I was wrong. That stack trace really points to the cause of the
>> >> problem: the way IPython displays cell results in the browser.
>> >>
>> >> More specifically, I've pinpointed this problem into the way IPython
>> >> displays restriction enzymes. You can try it in your same Ipython
>> >> notebook:
>> >>
>> >>    from Bio import Restriction as rst
>> >>    rst.EcoRI
>> >>
>> >> The code above will never fail in a regular Python shell, but will
>> >> fail in IPython.
>> >>
>> >> Why is this the case? I suspect it has something to do with the way
>> >> Biopython's Restriction module is written. Turns out, there's already
>> >> some nifty metaclass tricks being employed there that allows a given
>> >> enzyme to have the class type of itself (e.g. instead of having a
>> >> RestrictionType class with an instance called EcoRI, we have a
>> >> metaclass RestrictionType with a class called EcoRI). To keep it
>> >> short, IPython seems to do an attribute lookup on these metaclasses
>> >> when it tries to display the object.  You'll notice that on line 333
>> >> of
>> >>
>> >> /data7/cfriedline/anaconda/envs/conda/lib/python2.7/site-packages/IPython/lib/pretty.py,
>> >> there is an expression that tries to get the class of the object to
>> >> display:
>> >>
>> >>     obj_class = getattr(obj, '__class__', None) or type(obj)
>> >>
>> >> However, these metaclasses have not been instantiated into a class and
>> >> thus do not have any 'size' attribute, IPython complains and raises an
>> >> error.
>> >>
>> >> So to sum up, this behavior may be cause by IPython instead of
>> >> Biopython. It's perhaps a good idea to mention this in the IPython
>> >> forum / mailing list, too. They've been doing a very impressive job so
>> >> far, so I have a hunch this may have popped up in one of their
>> >> discussions.
>> >>
>> >> I have to admit that my metaclass chops are still very limited as
>> >> these usually aren't required for most Python programming. But if
>> >> you're interested this SO page
>> >>
>> >> (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python)
>> >> has a very easy to follow explanation about what they are and why they
>> >> are useful.
>> >>
>> >> Anyway, that's enough for now I guess :).
>> >>
>> >> Cheers,
>> >> Bow
>> >>
>> >> P.S. Peter, perhaps these other Restriction bugs are related with the
>> >> metaclass? I've never delved that deep into the submodule's codebase,
>> >> but it looks like there are some very interesting tidbits there.
>> >>
>> >> On Wed, Dec 4, 2013 at 5:48 PM, Christopher J Friedline
>> >> <cfriedline at vcu.edu> wrote:
>> >> > Hi everyone,
>> >> >
>> >> > I ran into this problem today, and wanted to bring it up to see if
>> >> anyone
>> >> > else has seen it.  Searching the archives didn't get me anywhere.
>> >> > I'm
>> >> > running a simple restriction analysis (on a random genome), and
>> >> > getting
>> >> > this error. If I look for cut sites with the enzymes individually, it
>> >> works
>> >> > for each. However, when I put them into a RestrictionBatch, I get an
>> >> error
>> >> > on the class.
>> >> >
>> >> > type object 'RestrictionType' has no attribute 'size'
>> >> >
>> >> > I put an IPython notebook describing this here:
>> >> >
>> >> > http://nbviewer.ipython.org/gist/cfriedline/7790932
>> >> >
>> >> > Bio (1.6.2), IPython (1.1.0), Python (2.7.6/Anaconda 1.8)
>> >> >
>> >> > Any help is appreciated,
>> >> >
>> >> > Thanks,
>> >> > Chris
>> >> > _______________________________________________
>> >> > Biopython mailing list  -  Biopython at lists.open-bio.org
>> >> > http://lists.open-bio.org/mailman/listinfo/biopython
>> >>
>> >
>> >
>> _______________________________________________
>> Biopython mailing list  -  Biopython at lists.open-bio.org
>> http://lists.open-bio.org/mailman/listinfo/biopython
>
>



More information about the Biopython mailing list