Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/allpy/raw-rev/2b3cad50c2b1
Дата изменения: Unknown
Дата индексирования: Tue Oct 2 07:48:57 2012
Кодировка:

# HG changeset patch
# User Daniil Alexeyevsky
# Date 1339330127 -14400
# Node ID 2b3cad50c2b138a4ee5de5aae1d304a642eb27c8
# Parent 149cb9d8928322544179071c335b69642b283c70
Partially reversed [afed1f] (see #49)

As explained in the ticket, in real life usecases having a monomer belong to
several sequences is sometimes extremely useful. ANY approach to attribution of
monomer to only one sequence will be either confusing or hindering.

* Removed `monomer.sequence` attribute
* Removed unncecessary specialcasing in pickle
* Removed unused tests
* Restored APIs to backward-compatible
* Added deprecated messages to the restored APIs

diff -r 149cb9d89283 -r 2b3cad50c2b1 allpy/base.py
--- a/allpy/base.py Sun Jun 10 15:20:37 2012 +0400
+++ b/allpy/base.py Sun Jun 10 16:08:47 2012 +0400
@@ -29,9 +29,6 @@
by_name = {}
"""A mapping from full monomer name to Monomer subclass."""

- sequence = None
- """A sequence the monomer belongs to."""
-
@classmethod
def _subclass(cls, name='', code1='', code3='', is_modified=False):
"""Create new subclass of Monomer for given monomer type."""
@@ -70,6 +67,32 @@
for code1, is_modified, code3, name in codes:
cls._subclass(name, code1, code3, is_modified)

+ @classmethod
+ def from_code1(cls, code1):
+ """Create new monomer from 1-letter code."""
+ deprecated(
+ "Monomer.from_code1(...) is deprecated in favor of Sequence.append_monomer(code1=...)"
+ )
+ monomer = cls.by_code1[code1.upper()]()
+ monomer.input_code1 = code1
+ return monomer
+
+ @classmethod
+ def from_code3(cls, code3):
+ """Create new monomer from 3-letter code."""
+ deprecated(
+ "Monomer.from_code3(...) is deprecated in favor of Sequence.append_monomer(code3=...)"
+ )
+ return cls.by_code3[code3.upper()]()
+
+ @classmethod
+ def from_name(cls, name):
+ """Create new monomer from full name."""
+ deprecated(
+ "Monomer.from_name(...) is deprecated in favor of Sequence.append_monomer(name=...)"
+ )
+ return cls.by_name[name.strip().capitalize()]()
+
def __repr__(self):
return "" % str(self.code1)

@@ -87,30 +110,6 @@
def __ne__(self, other):
return not (self == other)

- def __getstate__(self):
- """Overcome difficulties with pickle.
-
- Pickle is unable to store `set`s/`dict`s that have objects referencing
- back the `set`/`dict` itself, which `sequence` in monomer does.
- ( http://bugs.python.org/issue9269 )
-
- To sidestep the bug we store the monomer WITHOUT `sequence` attribute.
-
- See also `Sequence.__setstate__`.
- """
- state = {}
- state.update(vars(self))
- if 'sequence' in state:
- del state['sequence']
- return state
-
- def _obsolete_method(cls, *args, **kws):
- """OBSOLETE"""
- raise AttributeError("Call to obsolete method.")
- from_code1 = classmethod(_obsolete_method)
- from_code3 = classmethod(_obsolete_method)
- from_name = classmethod(_obsolete_method)
-
class MarkupContainerMixin(object):
"""Common functions for alignment and sequence for dealing with markups.
"""
@@ -199,12 +198,19 @@
elif name:
cls = self.types.Monomer.by_name[name.strip().capitalize()]
monomer = cls()
- monomer.sequence = self
monomer.input_code1 = code1
self.append(monomer)
return monomer

@classmethod
+ def from_monomers(cls, monomers=[], name='', description='', source=''):
+ """Create sequence from a list of monomer objecst."""
+ deprecated(
+ "Sequence.from_monomers(...) is deprecated in favor of Sequence(...)"
+ )
+ return cls(monomers, name, description, source)
+
+ @classmethod
def from_string(cls, string, name='', description='', source=''):
"""Create sequences from string of one-letter codes."""
self = cls([], name=name, description=description, source=source)
@@ -226,26 +232,6 @@
"""Hash sequence by identity."""
return id(self)

- def __setstate__(self, state):
- """Overcome difficulties with pickle: add `monomer.sequence` after loading.
-
- Pickle is unable to store `set`s/`dict`s that have objects referencing
- back the `set`/`dict` itself, which `sequence` in monomer does.
- ( http://bugs.python.org/issue9269 )
-
- To sidestep the bug we store the monomer WITHOUT `sequence` attribute.
-
- See also `Monomer.__getstate__`.
- """
- vars(self).update(state)
- for monomer in self:
- monomer.sequence = self
-
- @classmethod
- def from_monomers(cls, *args, **kws):
- """OBSOLETE."""
- raise AttributeError("Sequence.from_monomers is obsolete")
-
class Alignment(MarkupContainerMixin):
"""Alignment. It is a list of Columns."""

diff -r 149cb9d89283 -r 2b3cad50c2b1 test/test_pickle.py
--- a/test/test_pickle.py Sun Jun 10 15:20:37 2012 +0400
+++ b/test/test_pickle.py Sun Jun 10 16:08:47 2012 +0400
@@ -18,6 +18,5 @@
s = pickle.load(file)
assert s.name == 'sequence'
assert str(s) == 'SEQVENCE'
- assert s[0].sequence is s

# vim: set et ts=4 sts=4 sw=4: