LINUX.ORG.RU
ФорумTalks

Питон такой питон

 


1

1
>>> import math
>>> math.pi
3.141592653589793
>>> math.pi=1
>>> math.pi
1

ну что я могу сказать. Геттеры и сеттеры как в C# рулят и позволяют избежать подобного в принципе

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 2)

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

что ты хотел от unix visual basic? хотя даже в басике был Const value.

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

Боюсь представить ваше удивление от сишки.

Ну и в питоне нет константности и приватных методов. Отсюда и ноги растут.

RazrFalcon ★★★★★
()

Это же надо, питон делает именно то, что ты ему сказал! Ужас-то какой!

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

В сишке такого не будет. Оба примера не скомпилируются.

#define PI 3.1415926

int main(void)
{
    PI = 1;
    return 0;
}

const double PI = 3.1415926;

int main(void)
{
    PI = 1;
    return 0;
}

Приватные методы, кстати, в питоне есть

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Ваш C-fu на троечку.

#include <stdio.h>

const int val = 12345;

int main(void)
{
    printf("%d\n", val);

    int *tmp = (int *)&val;
    *tmp = 678;

    printf("%d\n", val);
    return 0;
}

#define

Это вообще про другое.

Приватные методы, кстати, в питоне есть

С каких пор?

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от cvs-255

double PI = 3.1415926

чего ж просто то не 3?

А твой const ещё и атрибут static тащит, что может быть не очень хорошо при вынесении в заголовочный файл.

Мог бы и constexpr хотя бы воткнуть, если подразумевается использование достаточно новых компиляторов.

На самом деле нужен тэг «я познаю мир», т.к в python нет констант. Можно их функцией иммитировать, возвращающей значение, но как это сделано в math не знаю.

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

Если у юзера отнять возможность стрелять по ногам, то получится малофункциональная фигня.

PS. В Паскале pi() - это функция.

saahriktu ★★★★★
()
Ответ на: комментарий от cvs-255

Изменение имени метода не делает его приватным.

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

AntonI ★★★★
()

и чо? идеальный язык для студентов - «а здесь примем Пи=4, иначе не сходится»

router ★★★★★
()

Из вот из всех минусов питона ты выбрал плюс.

We are all consenting adults here.

t184256 ★★★★★
()

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

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

Мог бы и constexpr хотя бы воткнуть, если подразумевается использование достаточно новых компиляторов.

Компиляторы C недостаточно новые %)?
Речь таки не про C++ ведь.

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

что может быть не очень хорошо при вынесении в заголовочный файл

Если я правильно помню книжку по С, то static при вынесении константы в заголовок это как раз самый правильный путь.

А твой const ещё и атрибут static тащит

А вот такого я что-то не помню.

UPD. Заинтересовался и глянул в гугл. static добавляется к const в С++. Учитывая constexpr в контексте С, у меня впечатление, что вы путаете С и С++. Что напомнило мне знакомого математика, который на полном серьёзе говорил, что не видит разницы между С и С++.

andalevor ★★
()
Последнее исправление: andalevor (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Боюсь представить ваше удивление от сишки.

#include <math.h>

#define M_PI 3

int main(void)
{
        return 0;
}

Предупреждение (которое можно сделать фатальным) есть:

$ gcc foo.c
foo.c:3: warning: "M_PI" redefined
    3 | #define M_PI 3
      | 
In file included from foo.c:1:
/usr/include/math.h:1065: note: this is the location of the previous definition
 1065 | # define M_PI  3.14159265358979323846 /* pi */
      | 
gag ★★★★★
()

Смотри как ещё можно:

import ctypes
def deref(addr, typ):
    return ctypes.cast(addr, ctypes.POINTER(typ))

def set_int(i, val):
    deref(id(i), ctypes.c_int)[6] = val

print(11) # 11
set_int(11, 42)
print(11) # 42
print(11 + 11) # 84
print(5 + 6) # 42
set_int(11, int.from_bytes(b'\x0b', 'little')) # чтоб не сегфолтнуло при выходе
PolarFox ★★★★★
()

Сравнил х*уй с пальцем, называется.

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

Забавно сделано в julia. Если сходу присвоить, то получится:

julia> pi = 3
3

А если сначала использовать, а потом присвоить, то не выйдет:

julia> pi
π = 3.1415926535897...

julia> pi = 3
ERROR: cannot assign a value to variable MathConstants.pi from module Main
Stacktrace:
 [1] top-level scope at REPL[1]:1
andalevor ★★
()
Ответ на: комментарий от question4

Там всего-навсего объявление property и переопределение __setattr__. Должно обходиться одним штатным object.__setattr__(x, k, v). Не пробовал.

t184256 ★★★★★
()

Ты не в Я.Л учишься? Мне дочь вчера показала похожее - я тоже прифигел слегонца, но мне даже нравятся такие штуки…

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

но мне даже нравятся такие штуки

Более того, плохого в этом ничего нет. Если кто-то решит изменить число Пи, то бог ему судья.

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

Ну это - уже удар ниже пояса.

я думаю, можно поправить writable через Object.defineProperty() и тогда можно будет и так поменять

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

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

InterVi ★★★★
()

Это просто значение и его иногда нужно менять. Например вдруг тебе дали спец библиотеку которой надо PI до 100500го знака. И ты такой

#include <math.h>
#include <stdio.h>

#undef  M_PI
#define M_PI 3.100500

int main(int argc, char *argv[])
{
    printf("%lf\n",M_PI );
    return 0;
}

Это по итогу бесполезное дело и даже юморное, но вдруг надо! :D

И всё. А потом ты решил что смысл жизни это ответ на всё и он должен быть константен! И ты так как знаешь ответ такой

#include <math.h>
#include <stdio.h>

#undef M_PI
static const double M_PI = 42;

int main(int argc, char *argv[])
{
    printf("%lf\n",M_PI );
    return 0;
}
LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Геттеры

Я ей дом оставлю в Персии, пусть берет сестру-мегерочку,
А на отцовские сестерции заведу себе гетерочку.

У гетер, хотя безнравственней, но они не обезумели.
У гетеры пусть все явственней, зато родственники умерли.
r_asian ★☆☆
()
Ответ на: комментарий от fsb4000

Что значит не работает? Компилируется? Компилируется. То что это UB - это дело десятое.

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

Это просто variable shadowing.

Ну так...

>>> import math
>>> math.pi
1
>>> math.pi = 1
>>> math.pi
1
>>> import imp
>>> imp.reload(math)
<module 'math' (built-in)>
>>> math.pi
3.141592653589793

Rodegast ★★★★★
()
Последнее исправление: Rodegast (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.