Pull to refresh
45
0
ARGHH@YARRR.ME @ACCOUNT

User

Send message
> add -p всю жизнь был hg record, reflog тоже есть, причем reflog интегрирован в битбакет (форма поиска по репозиторию умеет его синтаксис),

а, ну отлично.

> rebase не пользуюсь, не знаю, может и нет

Это такая интерактивная переписывалка истории.
> По-моему единственная проблема git — это сложность.

Git простой и предельно логичный в своей архитектуре. Сложности и магия возникли тогда, когда попытались сделать «как в свн», тут-то абстракции потекли.
Ой, а в mercurial уже есть аналоги git add -p, git rebase -i и git reflog?
>>> class A(object):
… __slots__ = []

>>> a = A()
>>> a.x = 1
Traceback (most recent call last):
File "", line 1, in AttributeError: 'A' object has no attribute 'x'
>>> hasattr(A(), '__dict__')
False
>>>
> Встроенные типы даних реализованы не на Пайтоне, поэтому нет возможности динамически добавлять атрибуты.

Возможность теоретическая есть, но этого не стали делать из соображений производительности. Встроенные классы — это полноценные классы в питоне. Т.е. я тоже могу создать класс без __dict__ и который будет себя вести также, как object.
> Кроме docs.python.org, там конечно все есть, но это справочник и надо знать, что ищешь.

Основное про классы и модель данных, тут:

docs.python.org/reference/datamodel.html#
ага, а откуда он появился? Мы ведь в Object ничего не писали и не добавляли, просто наследовали.
Кстати, есть забавная задачка, связанная с дескрипторами:

>>> x = object()
>>> x.foo = 1
Traceback (most recent call last):
File "", line 1, in AttributeError: 'object' object has no attribute 'foo'
>>> class Object(object): pass

>>> y = Object()
>>> y.foo = 1
>>> y.foo
1
>>>

почему так, ведь мы только наследовали класс, но при этом, ничего не добавляли и меняли. Ну и почему в x=object() нельзя добавлять новые атрибуты.
>>> Bar().baz

Я полагаю будет эксепшн, поскольку атрибуты метакласса доступны только классу, но не инстансу класса :)
> тест на понимание работы @property

Этот тест скорее на понимание того, что Bar является объектом Foo и поэтому в Bar доступны все классовые переменные из Foo, а не только property.
Дескриптор — это интерфейс атрибута объекта или класса. Т.е. инстанс дескриптора — это атрибут, для которого можно определить операции:

1) getattr и тогда вызывается метод __get__,
2) установки атрибут (setattr)
3) и удаления атрбиута(delattr)

class Descriptor(object):
def __get__(*args, **kw):

def __set__(*args, **kw):


class Foo(object):
x = Descriptor()
y = 1

foo = Foo()
Что будет происходить при вызове foo.x определяется в __get__ методе дескриптора, ну и так далее.
Тут можно было и без дескрипторов обойтись.

>>> import types
>>> a.add_x = types.MethodType(add_x, a)
Исходя из моего опыта, гит лучше понимается и воспринимается, если изучать его снизу вверх: начиная с комманд git cat-file, git update-ref, git write-tree, git reflog, git rev-parse и т.д. Даже есть вот такой туториал на аглицком: ftp.newartisans.com/pub/git.from.bottom.up.pdf.
dajaxproject.com — писать на питоне, чтобы не писать на js? Я до сих пор не могу простить авторам джанги forms и widget, которые вообще никак не вписываются ни в mvt, ни в mvc — чтобы поменять css класс — надо лезть в forms.py, потом искать виджет, а если не повезет, то еще и в темплейт виджета.

> thread local

не то.

> синглтон

Легко злоупотребить синглтонами, и вообще, singletons considered harmful (с).
> Если второе, то как бы глобальные переменные,

Нельзя поменять значение глобальной переменной только для данного конкретного execution context — в лиспе dynamic scope (к сожалению, не знаю, как это переводится все на русский язык).

> thread local переменные и синглтоны к вашим услугам. И, опять же, это не полный аналог — но полностью подходящий для решения большинства практических задач.
> Я придерживаюсь позиции что автор чуток преувеличил и на практике роль синтаксиса конкретного языка не так важна.

Совершенно верно, синтаксис не так важен. У лиспа (CL, scheme, clojure) как раз множество интересных свойств в самой семантике.

> Но для языков общего назначения и практических задач, решаемых программистами, разница между лиспом и тем же C на мой взгляд не такая огромная, как старается показать автор.

На самом деле автор не очень любит CL :) И как рза разница есть и действительно очень большая, это совсем разные языки. Начиная с типизации, сборщика мусора, синтаксиса, ООП и прочим.
> ИМХО, преувеличение, вызванное недостаточным знанием других языков программирования. Конечно, встроенный в язык AST, списки и сборщик мусора это хорошо — но это не какое-то фатальное преимущество.

Помимо макросов, в CL, например, есть еще система рестартов, которая мощнее просто исключений, CLOS с мультиметодами, множественным наследованием, богатой системой классов; метаобъектный протокол (MOP), возможность возвращать несколько значений функцией, динамические переменные, символы и прочее.

> LISP

Так назывался первый лисп в 50ых годах.

> Могу предположить, что автор статьи, как и многие другие, рассматривает программирование исключительно в разрезе решения академических задач — технически простые программы, которые занимаются математическими рассчетами. Область, конечно, хорошая — но, ИМХО, очень нишевая.

Автор — Марк Тарвер — да, потому что он ученый. Но лисп (CL) — это все-таки промышленный язык, на которым в конце концов была написана операционная система и уйма софта к ней — всякие кады, редакторы и т. д.
1

Information

Rating
Does not participate
Registered
Activity