@ru_python

Страница 8416 из 9768
any
19.03.2019
05:43:23
Всем привет. Подскажите, как можно изменить переменную b из класса

Google
any
19.03.2019
05:43:28
class a: def init(self): b = 3 if name == 'main': b = 1 a() print(b)

Выводит 1, а нужно 3

Tishka17
19.03.2019
05:44:17
А почему ты решил что будет 3?

Ты в классе в ините создал локальную переменную и сохранил в нее 3

Aragaer
19.03.2019
05:44:36
надо global b и прочую подобную муть

Tishka17
19.03.2019
05:44:50
Не учи плохому

any
19.03.2019
05:45:08
Везде global писать - говнокод какой-то получается

Aragaer
19.03.2019
05:45:12
ага

Tishka17
19.03.2019
05:45:14
Aragaer
19.03.2019
05:45:19
ну оно уже говнокод, так что

any
19.03.2019
05:45:38
Ты что хочешь сделать?
Изменить внешнюю переменную нужно

Google
Tishka17
19.03.2019
05:45:53
Изменить внешнюю переменную нужно
Не нужно. Это нарушение зоны ответственности класса

Классу должно быть по барабану на внешние переменные

Есть поля, есть возвращаемые значения в методах или можно прокинуть внутрь какой-нибудь контейнер, в котором он сможет что-то менять

any
19.03.2019
05:47:35
Хорошо, буду думать

Tishka17
19.03.2019
06:19:24
Я тут чтото вспомнил. Почему-то люди противопоставляют функциональное и юнит-тестирование. Так вот это не противоположности, а перпендикулярные оси. Делить тесты можно по разным признакам: функциональное vs тестирование производительности, юнит vs интеграционное. И ещё: при юнит тестах не обязательно тестировать каждый метод класса. Юнитом вполне может считаться отдельный класс. Например, очевидно что геттер и сеттер одного поля нельзя проверить независимо не влезая во внутреннюю структуру объекта или не имея альтернативного сеттера (например параметра конструктора)

Aragaer
19.03.2019
06:22:20
ну я например в юнит тестах использую "сначала протестировал метод Х, затем тестирую метод У в предположении, что Х работает корректно"

и да, сеттеры-геттеры очевидно тоже

Tishka17
19.03.2019
06:23:34
это норм, да

но иногда X без Y не проверить же. Приходится покрывать пару

Aragaer
19.03.2019
06:24:11
вообще, я не сильно думаю на тему атомарности какой-то. Я если по тдд, то "так, мне надо такое поведение... как мне проще всего проверить это?"

и там как пойдет

Tishka17
19.03.2019
06:25:03
это да, просто несколько раз натыкался на “надо сначала проверить xxx, только потом yyy”. Да как я проверю что там сделал xxx без вызова yyy?

Aragaer
19.03.2019
06:25:45
ну условно, пусть я тестирую свой дикт и хочу проверить, что set и get работают

Tishka17
19.03.2019
06:26:02
типа class X: def __init__(self): self.data=0 def set(self, v): self.data=-v def get(self): return -self.data вполне нормальный класс

Aragaer
19.03.2019
06:26:03
я могу проверить, что без всяких set один get вполне вернет то, что передано в конструктор

я могу проверить, что сам по себе get вернет какой-нибудь эррор

и наконец я проверю, что после успешного set последующий get вернет то, что надо

Tishka17
19.03.2019
06:26:41
Сергей
19.03.2019
06:26:47
Всем привет. Подскажите, как можно изменить переменную b из класса
Вопрос предполагает двусмысленность. Изменить переменную b, которая находится в классе или изменить общую переменную b, находясь при этом в классе. На второй вариант ответили, а на первый ответ a1 = a() a1.b

Aragaer
19.03.2019
06:27:17
типа class X: def __init__(self): self.data=0 def set(self, v): self.data=-v def get(self): return -self.data вполне нормальный класс
и я не могу придумать ни одного теста, который бы показал, что у него "неправильная" реализация

Google
Tishka17
19.03.2019
06:27:42
и я не могу придумать ни одного теста, который бы показал, что у него "неправильная" реализация
вот и я о том же, а специально ради теста править конструктор - смысла нет

Aragaer
19.03.2019
06:27:57
и не надо

поведение этого класса такое, какое надо

Tishka17
19.03.2019
06:28:05
исправив конструктор мы увеличим сложность класса и по сути тесты будут дублировать

Aragaer
19.03.2019
06:28:15
"исправлять" этот класс надо не из-за тестов

Tishka17
19.03.2019
06:28:15
меня пару раз убеждали что надо

Aragaer
19.03.2019
06:28:46
то есть так - не надо менять _поведение_ этого класса, оно правильное

но можно поменять его реализацию - то есть отрефакторить его

и для этого не нужно править тесты, потому что на этапе рефакторинга мы тесты не трогаем

Tishka17
19.03.2019
06:29:30
ну да, только тесты от этого не изменятся. Ну только если при реализации мы не захотим какие-то новые граничные значения проверить

вот и отлично

Aragaer
19.03.2019
06:31:11
вообще, если поведение класса описывается словами типа "есть get и set, если сначала сделать set, то потом get вернет то, что отдали в set, а если не вызывать set, то get вернет 0" - то для проверки этого поведения не нужно ничего, кроме того, что описано в этом поведении

LighteR
19.03.2019
06:33:28
@Tishka17 а что есть люди, которые утверждают что тест на get/set надо делать раздельными unit-test'ами?

Tishka17
19.03.2019
06:33:38
да

регулярно

LighteR
19.03.2019
06:34:13
по-моему все пишут один тест на get/set

Essentuki
19.03.2019
06:34:15
LighteR
19.03.2019
06:35:10
там же либо мокать надо, либо тестировать внутреннюю реализацию

Tishka17
19.03.2019
06:35:45
да

Daniel
19.03.2019
06:36:20
Тут есть люди, кто прогает на маке?)

Google
LighteR
19.03.2019
06:36:28
но если в get/set, например, запросы в базу, я бы замокал

Tishka17
19.03.2019
06:38:27
но если в get/set, например, запросы в базу, я бы замокал
ну тут есть внешняя зависимость - база

но если в get/set, например, запросы в базу, я бы замокал
хотя смотря что там за объект, я бы скорее всего базу не мокал, ибо всякие селекты мокать запаришься. Либо не тестил бы вообще, либо тестил на реальноцй базе

Daniel
19.03.2019
06:40:01
увы, я
Как поставить 3.7 питон на пичарм, у я не могу не интерфейс поменять, ни найти кнопочку за это отвечающую, я скачал питон с офф сайта и вроде он появился в выборе компиляторов

На маке*

Aragaer
19.03.2019
06:40:30
вообще, в зависимости от заковыристости реализации, я бы могу предложить следующие тесты: - только get - set, потом get - set, set, get - set, get, get - set, get, set, get

Daniel
19.03.2019
06:40:31
Ну, просто установил его

?

Paul
19.03.2019
06:41:22
как передать по HTTP public key - alices_public_key print(alices_public_key) # UmbralPublicKey:036e2d8feb51ad5 print(type(alices_public_key)) # "<class 'umbral.keys.UmbralPublicKey'>" чтоб на flask сервере его можно было прочитать ?

Daniel
19.03.2019
06:41:46
А как в это меню попасть, если я в проекте нахожусь?

Tishka17
19.03.2019
06:41:54
а дальшне все кнопки на скрине

Daniel
19.03.2019
06:42:06
Спасибо

Aragaer
19.03.2019
06:43:33
но на самом деле такие заковыристые тесты они бы родились не на пустом месте, а именно из реализации. "а, вы вон как хитро делаете! А тогда если я сделаю сначала get, потом set, а потом еще два раза get, то у вас все навернется"

Google
Aragaer
19.03.2019
06:44:21
не совсем. Это как обоснование для исправления

Aragaer
19.03.2019
06:44:40
потому что "у вас тут не код, а говно" - "но оно же работает!" - "а вот вам тест" - "ну ок"

Paul
19.03.2019
06:44:47
LighteR
19.03.2019
06:45:12
хотя смотря что там за объект, я бы скорее всего базу не мокал, ибо всякие селекты мокать запаришься. Либо не тестил бы вообще, либо тестил на реальноцй базе
Не, не тестить вообще такой себе вариант. На проектах где 100% coverage обязательно условие - это вообще не вариант. Ну и я считаю, что unit-test не должны зависеть от окружения (бд, другие сервисы и т.д.). Если нужно тестировать с реальными базами, то пиши интеграционные тесты

Tishka17
19.03.2019
06:45:21
да
не надо https реализовывать во flask, юзай nginx

?
19.03.2019
06:45:27
да
Не буду ничего утверждать, но скорее всего фласк этим не занимается

LighteR
19.03.2019
06:45:49
не надо https реализовывать во flask, юзай nginx
+1. Терминация https в приложение - плохая идея

Paul
19.03.2019
06:46:16
не надо https реализовывать во flask, юзай nginx
он у меня типа serverless в облаке

Tishka17
19.03.2019
06:46:57
он у меня типа serverless в облаке
тогда что там у тебчя облако умеет

Страница 8416 из 9768