LINUX.ORG.RU

Что более корректно ?

 


0

3
t = 1
if r is null: t = 2

или

if r is null:
    t = 2
else:
    t = 1

1 вариант ? Ведь во втором случае t неопределен на верхнем уровне ?



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

Ведь во втором случае t неопределен на верхнем уровне ?

В том и дело что определён. Очень удивился обнаружив в питоне такую глупость

Debasher ★★★★★
()

Ведь во втором случае t неопределен на верхнем уровне ?

Что помешало проверить и убедиться что это не так? IF не создает нового scope.

null

None?

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

Ну... Скажем так, это во многом отличается от «привычного» поведения и это надо запоминать.

Solace ★★
()

Надо больше кода. Или чего ты там ещё хочешь?

t = 0
if r is null:
    t = 2
else:
    t = 1

if t = 0: 
    print "FIXME: Something's wrong with var 't'."
    raise

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

Отсутствие спецификаторов my/local/var тебя при этом не сильно удивило, видимо скилл в лексическом скопинге и вообще чтении доков у тебя так себе.

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

у меня просто мозг функциональщиной повреждён, не заморачивайся)

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

в c++ так:

int testifscope(int *r) {
    if (r == NULL)
        int t = 2;
    else
        int t = 1;
    return t;
}
g++     ifscope.cpp   -o ifscope
ifscope.cpp: В функции «int testifscope(int*)»:
ifscope.cpp:8:12: ошибка: нет декларации «t» в этой области видимости
     return t;
hatefu1_dead
()
Ответ на: комментарий от hatefu1_dead

Не-не-не, я не про это. Я про то что у IF должен быть свой scope. А тут привел пример того что в си/cpp нужно предварительно объявлять переменные. Очевидно что и в cpp if не является отдельной областью видимости.

true_admin ★★★★★
()

В первом случае, если условие r is None истинно, получается лишнее присвоение. Сначала присваиваем t значение 1, а потом 2. Но это, конечно, «экономия на спичках» и вцелом пофиг. Второй вариант лучше, потому что «явное лучше неявного». Ну или t = 2 if r is None else 1 в одну строчку

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

тут у if своя область видимости, и t определена только в ней:

int testifscope(int *r) {
    int x = 0;
    if (r == NULL) {
        int t = 2;
        x += t;
    } else {
        int t = 1;
        x += t;
    }
    return x;
}
g++     ifscope.cpp   -o ifscope
echo $?
0
hatefu1_dead
()
Ответ на: комментарий от true_admin

Я что-то не припомню ЯП где было бы по-другому

Кресты, жабка скорее всего тоже, лисп. Собственно практически везде, где скоуп разруливается при компиляции.

Иначе как делать присвоение в IF?

Использовать 1 вариант, если переменная объявлена в верхнем скоупе, то всё ок.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

t = 2 if r is null else 1
или второй вариант.
а первый это что-то лишнее.

Goury ★★★★★
()

А тернарных операторов в этот ваш Python не завезли?

Типа:

t = (1, 2)[r == None]
EXL ★★★★★
()
Ответ на: комментарий от zz

let x = 10;

А если без let то из какой области видимости возмётся x?

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

Ну... Мое имхо такое - pep8 хоть и иногда неудобен для использования, но вещь все-таки разумная и полезная. У меня в vim, например, весь код автоматически проходит проверку при сохранении файла.
Оверхед, но мне кажется разумным.

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

так не нужно делать, потому что есть тернарный if, и, если нужно будет возвращать не 2, а 0, твое выражение будет неправильно работать.

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

ПЕП8 это набор говноправил для жопоруких говнокодеров.
Единственное для чего оно нужно — чтобы индусский код толпы жопоруких говнокодеров можно было хоть как-то поддерживать.
В проектах, которые пишут адекватные люди, болшинство правил ПЕП8 не просто бесполезны, но вредны.

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

Эт я для разнообразия, в треде уже несколько раз тернарный был.

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

болшинство правил ПЕП8 не просто бесполезны, но вредны.

Можно узнать какие правила pep8 ты считаешь вредными?

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

ПЕП8 это набор говноправил для жопоруких говнокодеров.

Это вечный спор о том, нужен ли code style. Если какие-то вещи из PEP8 мешают в определенном месте, то нет ничего плохого в том, чтобы их локально нарушать.
В общем случае я категорически не согласен, но тут не Talks и оффтоп разводить не хочется.

Solace ★★
()
Последнее исправление: Solace (всего исправлений: 1)
t = r is None ? 2 : 1

но это не явно. Лучше явное:

t = 2 if r is None else 1

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

он и объявляет t внутри условия.

Окей, возможно, питон схавал мой моск. Я просто различаю «просто присвоение» от явного разграничения видимости при помощи global/local/nonlocal или же let или int x = ... . Без явного указания области видимости поведение if в питоне совпадает со многими другими ЯП (кроме go, спасибо за указание, beastie). Или я не прав?

cast no-such-file, hatefu1_dead

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

У if'а нет области видимости, это всего лишь кейворд. А вот у тела условия/цикла есть свой, отдельный скоп. Если бы нового скопа не возникало, то такой код бы (условно) работал:

int myfunc(int a) {
  if (a) {
    int t = 1;
  }
  return t;
}

Потому что тогда в теле if'а был бы текущий скоп, а не новый. Почему условно? Потому что при a==0 возникала бы неопределенность — t вообще существует ли, и если да, то какое у него значение? Из инициализатора или рандомное? В перле тоже (при use strict) ты обязан объявлять my-переменные в том скопе, в котором они используются, иначе получишь «aborted due to compilation errors». То же самое во всех языках в с полным лексическим скопингом (большинство).

Питон пошел по другому [известному] пути — все тело функции наследует ее скоп, а полноценных замыканий (вложенная функция, меняющая переменные внешней) не существует, поэтому у интерпретатора нет проблемы понять, где же именно «создать» t при t=1 — не требуется объявлять локальные переменные. Но зато надо объявлять глобалы, на что есть отдельный кейворд. Подход питона удобен в ультраприкладном коде, который может писать даже обезьянка, ей только надо убедиться, что ее t будет существовать на момент использования, потому что компилятор этого предсказать не может:

if a:
   t = 1
print(t) # а что если 'a==False'?

(инфа у меня времен 2.6/2.7, за новостями не слежу)

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

все тело функции наследует ее скоп, а полноценных замыканий (вложенная функция, меняющая переменные внешней) не существует

nonlocal: http://stackoverflow.com/questions/1261875/python-nonlocal-statement

ей только надо убедиться, что ее t будет существовать на момент использования, потому что компилятор этого предсказать не может

ЕМНИП, этим болеют очень многие скриптовые языки. Конкретно, все те что умеют выдавать undefined variable только в рантайме.

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

Можно узнать какие правила pep8 ты считаешь вредными?

Ты просто посмотри на его код: https://bitbucket.org/mlug/mlug.ru-django/src/a8458a5446a2f480e0c48ebb3cd042c...

Я думаю, человек слез с какого-то друго ЯП и решил не менять привычек.

Я тоже местами pep8 недолюбливаю, но я бы не хотел программировать в паре с тем кто категорично утверждает что pep8 говно.

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

Не, это я лажанул заявив что у if нет своей области видимости. Если бы знал то написал бы сразу нормально :(

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

Вся суть в том, что там табы. И ужасное выравнивание, которого лучше бы не было, в прочих случаях.

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

Ты как всегда чушь несешь. Иф должен иметь возможность работать с внешними переменными. Наличие локального скопа никак на это не влияет. Хотя в пистоне if — это говносинтаксис, в нормальных языках приблизительно то же самое, хотя там if являетсявыражением и имеет локальный скоп. Если локаьный скоп не перекрывает переменную, все ок. Переменная не определена «на верхнем уровне», ее можно сеттить и без определения. И это обычная практика. В том числе и в лиспах так сделано. Возьмись уже за буквари, мля, не позорься.

somequest
()
def get_t(r):
    if r is None:
        return 2
    else:
        return 1

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