На самом деле Python имеет абстрактные классы с методами abstact:
>>> import abc
>>>
>>> class IFoo(object):
... __metaclass__ = abc.ABCMeta
...
... @abc.abstractmethod
... def foo(self):
... pass
...
>>> foo = IFoo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cant instantiate abstract class IFoo with abstract methods foo
>>> class FooDerived(IFoo):
... pass
...
>>> foo = FooDerived()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cant instantiate abstract class FooDerived with abstract methods foo
>>> class FooImplements(FooDerived):
... def foo(self):
... print "foo'ed"
...
>>> foo = FooImplements()
>>> foo.foo()
foo'ed
>>>
С другой стороны, основной вопрос "- это пифонический" немного сложнее сказать. Если вы намерены предоставить абстрактный базовый класс, чтобы позже вы могли проверить, чтобы значения наследовали от него, то нет, это не особенно pythonic, хотя можно сделать произвольные типы абстрактными подклассами вашего базового класса. С другой стороны, вполне нормально предоставлять абстрактный базовый класс, который реализует некоторые функции на основе реализации, предусмотренной в конкретных подклассах. Например, collections.Sequence
и collections.Mapping
делают это только для классов типа like и dict; подклассы могут предоставить __getitem__
и могут бесплатно получить __contains__
и другие.
Наверняка, вы никогда не должны использовать assert()
, кроме как для документирования ожиданий кода; Если на самом деле возможно, что assert будет терпеть неудачу, вы не должны использовать assert. Оптимизированный питон (python -O script.py
) не проверяет утверждения.
Edit: more exposition:
Если вы проверяете тип значения:
def foo(bar):
if not isinstance(bar, AbstractBaz):
raise ValueError, ("bar must be an instance of AbstractBaz, "
"got %s" % type(bar))
Если по какой-либо причине вы не можете использовать @abstractmethod
, но все же хотите получить этот эффект, вы должны поднять NotImplementedError
. Возможно, вы захотите сделать это, потому что вам действительно нужны экземпляры этого класса, некоторые из которых, возможно, не нуждаются в реализации дополнительных функций. Вы все равно должны учитывать возможность того, что функция была вызвана через super()
. В первом приближении это может выглядеть так.
class Foo(object):
def bar(self, baz):
if self.bar.im_func == Foo.bar.im_func:
raise NotImplementedError, "Subclasses must implement bar"
Один из способов сделать это:
while read p; do
echo "$p"
done <peptides.txt
Как указано в комментариях, у этого есть побочные эффекты обрезки ведущих пробелов, интерпретации последовательностей обратной косой черты и пропуска последней строки, если в ней отсутствует завершение перевода строки. Если это вызывает беспокойство, вы можете сделать:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
В исключительных случаях, если тело цикла может считываться со стандартного ввода , вы можете открыть файл, используя другой дескриптор файла:
while read -u 10 p; do
...
done 10<peptides.txt
Здесь 10 - это просто произвольное число (отличное от 0, 1, 2).
Это прибывает скорее очень поздно, но с мыслью, что это может помочь кому-то, я добавляю ответ. Также это не может быть лучшим способом. head
команда может использоваться с -n
аргумент для чтения n строки от запуска файла и аналогично tail
, команда может использоваться для чтения из нижней части. Теперь, для выборки энный строка из файла мы возглавляем n строки , передаем данные по каналу для конца только 1 строки от переданных по каналу данных.
TOTAL_LINES=`wc -l $USER_FILE | cut -d " " -f1 `
echo $TOTAL_LINES # To validate total lines in the file
for (( i=1 ; i <= $TOTAL_LINES; i++ ))
do
LINE=`head -n$i $USER_FILE | tail -n1`
echo $LINE
done
cat peptides.txt | while read line
do
# do something with $line here
done
и вариант с одной строкой:
cat peptides.txt | while read line; do something_with_$line_here; done
Эти параметры пропустят последнюю строку файла, если нет перевода строки в конце.
Этого можно избежать, выполнив следующие действия:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Вариант 1a: Цикл While: По одной строке за раз: Перенаправление ввода
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Вариант 1b: Цикл While: По одной строке за раз:
Откройте файл, прочтите из файлового дескриптора (в данном случае файлового дескриптора №4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done