Уведомления

Группа в Telegram: @pythonsu

#1 Июль 28, 2017 21:52:52

SIDS
Зарегистрирован: 2017-07-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

Пытаюсь разобраться в коде, но никак не могу понять строчку с оператором if
Вроде data_value типа tuple, что тогда означает его сравнение == 0 ?

 def get_data_value(data, data_size):
    '''The helper function to get value of the data
    field from parameters header.'''
    fmt = "{}s".format(data_size)
    data_value = struct.unpack(fmt, data[0:data_size])
    if data_value == 0:
        data_value = struct.unpack(fmt, data[8:data_size])
    data_value = struct.unpack("b", data_value[0])
    return data_value[0]

Офлайн

#2 Июль 29, 2017 00:17:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

Там, наверное, что-то другое было, потом это поменяли, а условие забыли поменять. struct.unpack() всегда возвращает кортеж.



Офлайн

#3 Июль 29, 2017 01:43:26

SIDS
Зарегистрирован: 2017-07-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

py.user.next
Там, наверное, что-то другое было, потом это поменяли, а условие забыли поменять. struct.unpack() всегда возвращает кортеж.
Спасибо ) а то я перерыл пол интернета и так и не понял, в чем дело

Офлайн

#4 Июль 30, 2017 21:56:08

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

> Там, наверное, что-то другое было, потом это поменяли, а условие забыли поменять

Вот это как раз одна из причин по которой я перехожу на Haskell.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Июль 31, 2017 00:02:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

Rodegast
Вот это как раз одна из причин по которой я перехожу на Haskell.
Я сейчас на сишнике прогу делаю. Возникла проблема “как открыть файл на терабайт?”, открыл, потом “как применить fseek() к терабайтному файлу?” - обычные проблемы сишника. Но вроде решилось всё постепенно. (Через специальные дефайны fopen() подменяется на fopen64(), но fseek() всё равно принимает long int для позиции, нельзя скакнуть далеко. Пришлось делать в обход.) Потом дальше “а как сделать мок для юнит-теста?”. Оказалось, что и тут не всё гладко. Решил делать без моков, иначе надо полностью менять фреймворк для юнит-тестов, а я так привык к стандартному, он такой удобный, я его даже ещё не изучил наполовину.

Короче, эти типы не проблема, проблема в ограничениях - когда не можешь что-то сделать.



Отредактировано py.user.next (Июль 31, 2017 00:07:13)

Офлайн

#6 Июль 31, 2017 01:21:00

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

Проблема не в типах, а в ошибках связанных с динамической типизацией. Например Haskell сабжевую ошибку не пропустил бы, но Python её просто не замечает. Хуже всего когда в больших проектах вот таких перманентных ошибок накапливается изрядное количество.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Июль 31, 2017 03:25:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

Rodegast
Проблема не в типах, а в ошибках связанных с динамической типизацией.
Так я тебе говорю, что это не проблема. Это всё можно выявить с помощью юнит-тестов. Проблема - это когда ты что-то сделать не можешь.
У этой, кстати, фигни есть и обратная сторона: если Go взять (я иногда смотрю по нему видео, хоть и не использую сам язык, учусь просто, перенимаю всякие методы), там нужно на каждый чих делать кастование. Это вообще неудобно. Ты не можешь присвоить целой переменной дробный нуль, нужно кастовать. Если C++ брать, там нет такого, хоть там и строгая типизация.

Зайди на https://golang.org/
Вот не работает это, потому что разные типы у них
func main() {
i := 0
fmt.Println(i == 0.5)
}
Мелочь такая, а сколько таких мелочей по всему коду?

А питон как бы полиморфизм реализует: ты делал функцию для кортежей, например, а работает она и для списков, и для строк, и для байтов, и для множеств, и для словарей, и вообще для итерабельных. Это же сравнение, оно что делает? запускается внутренние методы магические - это мощь.



Отредактировано py.user.next (Июль 31, 2017 03:37:39)

Офлайн

#8 Июль 31, 2017 07:46:08

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

Rodegast
Вот это как раз одна из причин по которой я перехожу на Haskell.
:) В разных языках разные ошибки. Я вот со студентами вожусь. Очень хорошо видно как человек пишет не то что имеет ввиду. И отлично они это делают на любых языках и на питоне и на C++ и на haskel и на ada. На последних меньше, поскольку мало кто их использует.
py.user.next
Возникла проблема “как открыть файл на терабайт?”
На сишке наверное. В плюсах проблем меньше поскольку там fstream в котором специальный тип для позиции в файле и для смещений. Но тоже была ложка дегтя MS ссылаясь на стандарт делали его unsigned long. а g++ и другие доступные к тому времени компиляторы делали тип таким что все было ок. Эта проблемка решилась патчем иклудников fstream у MS Visual studio.

Так что поддержу. Важна возможность преодолеть затык малой кровью.



Офлайн

#9 Июль 31, 2017 08:14:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

py.user.next
Если C++ брать, там нет такого, хоть там и строгая типизация.
C++ - язык со слабой типизацией

py.user.next
Это же сравнение, оно что делает? запускается внутренние методы магические - это мощь.
py.user.next
Это всё можно выявить с помощью юнит-тестов
Ну и нахрена нужна была бы такая мощь, наличие которой обязывает к стопроцентному покрытию юнит-тестами? Мне кажется гораздо более логичной ситуация, когда ошибки выявляются компилятором, а не тестом. Если отставить в сторону снобизм, то для большей части задач юнит-тестирование вообще не нужно. Ну вот есть у меня на клиенте контроллер, который обрабатывает событие клика на иконке и показывает попап. Что я тут должен тестировать? А только ту гипотетическую ситуацию, когда чьи-то кривые руки изменят АПИ компонента-попапа. Если у меня клиентский код на тайпскрипте, то проблема решается сама собой - дженкинс не сможет собрать бандлы, коммит не попадет в мастер, криворукий гражданин во время не закроет задачу и больше никогда так не будет делать. С джаваскриптом проблему увидит либо пользователь, либо тест и то не факт, что автотест тут чем-то поможет. У питона те же самые косяки, которые никогда и ни за что не позволят столь вольно типизируемому языку стать стандартом разработки больших промышленных решений.



Офлайн

#10 Июль 31, 2017 15:06:41

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Сравнение tuple с нулем

> Так я тебе говорю, что это не проблема. Это всё можно выявить с помощью юнит-тестов.

ИХМО тесты это совсем не панацея.

> Это же сравнение, оно что делает? запускается внутренние методы магические - это мощь.

Сравнение двух несравнимых значений должно вызывать ошибку. Haskell сохраняет полиморфизм, при чём такие ситуации сразу отлавливаются:

 Prelude> let i = 0.5
Prelude> let n = 1
Prelude> i == n
False
Prelude> i < n
True
Prelude> let err = '1'
Prelude> i == err
<interactive>:7:1: error:
     No instance for (Fractional Char) arising from a use of i
     In the first argument of (==), namely i
      In the expression: i == err
      In an equation for it: it = i == err

> В разных языках разные ошибки.

Ошибки всё-таки не в языках, а в программах



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version