LINUX.ORG.RU

Только если опциональная.

Lilly
()

На первый взгляд выглядит еще бесполезнее, чем типы в Typed Racket.

anonymous
()

Предлагает хинты указывать в коментах?

x = []  # type: Sequence[int] 
За такое сразу нужно закапывать живьём в землю. И вообще местами странные вещи пишет
AnyStr = Var('AnyStr', str, bytes) 
def longest(a: AnyStr, b: AnyStr) -> AnyStr
y = longest('a', b'abc')  # Fails static type check 
В общем, с таким подходом ничего хорошего не получится.

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 1)

Неплохо, а раз это «Guido van Rossum, Dec 19, 2014» пишет, то есть шанс что будет поддерживаться всеми исполняющими средами.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Virtuos86

Ради этого стоит всем ползти в сторону python-3.x, вот это уже серьезный стимул миграции.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от tailgunner

Мне внутренняя ванга говорит, что не взлетит, так что нефиг радоваться. Не, а реально, какие проблемы ты планируешь ей решить?

niemand
()
Ответ на: комментарий от niemand

Мне внутренняя ванга говорит, что не взлетит

Я вообще не о взлете спрашивал, а об опыте.

какие проблемы ты планируешь ей решить?

Я рассчитываю использовать «ее» для статической проверки программ.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я не очень большой спец по статической типизации и петону, но по-моему в языках со слабой типизацией, где

3*1.0 = 3.0 (int*float = float), причем int и float друг с другом никак не связаны

или [1]*2 = [1,1] list * int = list

устраивать какую-то статическую проверку типов - это что-то не то. Как вообще определить, окей или не окей умножать mytype на mytype в статике?

niemand
()
Ответ на: комментарий от niemand

Я не очень большой спец по статической типизации и петону, но по-моему в языках со слабой типизацией

Большое спасибо, достаточно.

tailgunner ★★★★★
()
Ответ на: комментарий от mashina

Предлагает хинты указывать в коментах?

«To help with type inference in complex cases».

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Начни с объяснения того, почему при умножении int на float получается именно float. Компилятор экстрасенс? Почему он неявно приводит тип int к float? Какие ещё есть «особые случаи»? В том же строго типизированном Common Lisp * умножает number и проблем с неявным приведением типов нет.

niemand
()
Ответ на: комментарий от tailgunner

Облом. Мне ещё и про питон надо рассказать, потому как я на нём почти не писал

niemand
()
Ответ на: комментарий от niemand

Тебя послушать, так java это слабо типизированный язык, потому что умеет умножать int на float.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от niemand
#!/usr/bin/env python3

class myint(object):
    def __init__(self, num):
        self.num = num

    def __mul__(self, b):
        if isinstance(b, myfloat):
            return self.num+'*'+b.num
        assert 0

class myfloat(object):
    def __init__(self, num):
        self.num = num

i = myint('123')
f = myfloat('qwe')

print(i*f)
anonymous
()
Ответ на: комментарий от mashina

Т.е. В каждом классе я должен реализовать __mul__ для всех вариантов, т.е

myint*myfloat myfloat*myint myint*myint myfloat*myfloat

И это даже с диспетчеризацией только по первому аргументу. Нафига эта «сильная» типизация такой ценой? Ни typeclass'ов, ни ООП нормального. Лучше бы неявно приводили

niemand
()
Ответ на: комментарий от niemand

Т.е. В каждом классе я должен реализовать __mul__ для всех вариантов

Нет, только у float который обрабатывает два типа в __mul__(...).

И это даже с диспетчеризацией только по первому аргументу. Нафига эта «сильная» типизация такой ценой? Ни typeclass'ов, ни ООП нормального. Лучше бы неявно приводили

Какую-то хрень несёшь не понимая смысла слов которыми её составляешь.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Нет, только у float который обрабатывает два типа в __mul__(...).

Ну-ну. Попизди мне тут

#!/usr/local/bin/python

class myfloat(object):
    def __init__(self, num):
        self.num = num

    def __mul__(self, b):
        if isinstance(b, myfloat):
            return self.num*b.num
        elif isinstance(b, myint):
            return self.num*b.num
        return NotImplemented

class myint(object):
    def __init__(self, num):
        self.num = num

i = myint(12)
f = myfloat(1.0)

print(f*i)
print(i*f)
niemand
()
Ответ на: комментарий от mashina

Ну и вернемся к выводу типов. Допустим, у нас есть самописные классы для int, float и double. При умножении int на float, получаем float, float на double получаем double. Как мне сделать автоматическое выведение типов для их произведения? Как выведение типов будет работать со встроенными классами?

niemand
()
Ответ на: комментарий от niemand

Допустим, у нас есть самописные классы для int, float и double. При умножении int на float, получаем float, float на double получаем double. Как мне сделать автоматическое выведение типов для их произведения?

А это принципиально отличается от любых других классов?

tailgunner ★★★★★
()
Ответ на: комментарий от niemand

И он будет знать заранее

Алгоритм вывода типа тривиально выведет тип функции plus. Кого ты называешь «он», «заранее» по сравнению с чем - ХЗ.

tailgunner ★★★★★
()
Ответ на: комментарий от niemand

Ну и вернемся к выводу типов.

Не нужно ни к чему возвращаться, мог бы сам уже давно придумать ответы на все свои вопросы.

1. В полностью динамическом ЯП вроде питона тип определяется по факту возвращаемого объекта, никакого вывода нет. Тот же __mul__() может вернуть что угодно и заранее не ясно что.

2. Хрень из топика ситуацию никак не меняет, она использует необязательные хинты которые ни к чему не обязывают даже если они указаны. Так по крайней мере в текущей реализации и навряд ли такое поведение будут ломать.

mashina ★★★★★
()
Ответ на: комментарий от niemand

почему при умножении int на float получается именно float. Компилятор экстрасенс?

Осиль уж документацию https://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-...

When a binary arithmetic operator has operands of different numeric types, the operand with the “narrower” type is widened to that of the other, where plain integer is narrower than long integer is narrower than floating point is narrower than complex. Comparisons between numbers of mixed type use the same rule. [2] The constructors int(), long(), float(), and complex() can be used to produce numbers of a specific type

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

man asm.js

Это из другой оперы. Там всё сделано для того, чтобы код был статически типизирован.

tailgunner ★★★★★
()
Ответ на: комментарий от niemand

Доки читить не Ъ? https://docs.python.org/2/reference/expressions.html#binary-arithmetic-operat...

The * (multiplication) operator yields the product of its arguments. The arguments must either both be numbers, or one argument must be an integer (plain or long) and the other must be a sequence. In the former case, the numbers are converted to a common type and then multiplied together. In the latter case, sequence repetition is performed; a negative repetition factor yields an empty sequence.

anonymous
()
Ответ на: комментарий от tailgunner

Алгоритм вывода типа тривиально выведет тип функции plus. Кого ты называешь «он», «заранее» по сравнению с чем - ХЗ.

1. В полностью динамическом ЯП вроде питона тип определяется по факту возвращаемого объекта, никакого вывода нет. Тот же __mul__() может вернуть что угодно и заранее не ясно что.

Я сегодня вместо анонiмуса

niemand
()
Ответ на: комментарий от niemand

Алгоритм вывода типа тривиально выведет тип функции plus. Кого ты называешь «он», «заранее» по сравнению с чем - ХЗ.

1. В полностью динамическом ЯП вроде питона тип определяется по факту возвращаемого объекта, никакого вывода нет. Тот же __mul__() может вернуть что угодно и заранее не ясно что.

Я же просил конкретно указать, где ты увидел противоречие. В приведенных высказываниях его нет. Алгоритм вывода в самом деле выведет тип plus; но в Python не используется никакой алгоритм вывода.

Топик о _разработке предложения_ по добавлению некоторой формы статической типизации в Python (эта форма будет включать в себя некоторый вывод типов); в чем я и mashina не сходимся, так это в полезности такого добавления.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Алгоритм вывода в самом деле выведет тип plus;

Нет, не виведет даже в таком простом случае. Потому что...

>>> class One(object):
...     def __init__(s, val): pass
...     
... 
>>> class Two(object):
...     def __init__(s, val): pass
...     
... 
>>> plus = lambda x,y: double(x+y)
>>> double = One
>>> type(plus(1,2))
<class '__main__.One'>
>>> double = Two
>>> type(plus(1,2))
<class '__main__.Two'>
>>> 
mashina ★★★★★
()
Ответ на: комментарий от niemand

тоже самое, что и твои примеры с «неявным» и «друг с другом не связанным».

ВНЕЗАПНО, нормальные доки и их осиляторство, вместе с тестами, могут вполне заменить стат. типизацию.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.