LINUX.ORG.RU

Можно ли в Python вернуть значение через переменную-аргумент

 


0

1

Всем привет!

Хочу в Python вернуть значение в переменную, заданную через параметр-аргумент, типа такого:

diff=aspiics_optics.diffraction(header,params,msg=diff_msg)

Хочу получить наверх diff_msg. Чего-то не выходит, снаружи значение не меняется. По-видимому это связано с «передача по ссылке/передача по значение». Везде в интырнетах советуют писать типа такого и принимать кортеж

diff, diff_msg = aspiics_optics.diffraction(header,params)

Но мне чего-то так не хочется (привык я к обычным функциям, а голова уже уехала в отпуск). Есть ли простое решение?

Не позорься и не занимайся фигнёй товарищ. Во-первых, чистая функция — это хорошо, во-вторых, тебе, вероятно, нужно ООП.

Лучше попытайся разобраться в азах, а не программировать наугад, вагон времени сэкономишь.

WitcherGeralt ★★
()

просто так низя. Если через объекты, то можно:

def my_func(in_arg, out_arg):
    out_arg.value = 'yes'

my_func('hello', out_arg)
Sahas ★★★★☆
()

Есть ли простое решение?

В качестве аргумента передавать изменяемые объекты - list, dict.

Но насколько это просто - можно поспорить.

vvn_black ★★★★★
()

Но мне чего-то так не хочется (привык я к обычным функциям, а голова уже уехала в отпуск). Есть ли простое решение?

Дождаться головы из отпуска и признать решение простым.

t184256 ★★★★★
()

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

Во-вторых, судя по названию diff_msg - строка. Строки в питоне иммутабельны.

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

hippi90 ★★★★★
()
diff=aspiics_optics.diffraction(header,params,msg=[diff_msg])
...

Везде в интырнетах советуют писать типа такого и принимать кортеж

И это правильно.

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

У меня эта функция шла прям сразу параметром к вызову другой функции. И её основная задача, как можно догадаться из названия, рассчитывать дифракционную картину на детекторе. Это основная и главная её задача (и достаточно сложная задача; настолько, что сейчас я расчеты делаю отдельно на кластере {OMG на фортране}, и сейвлю их в файлы; а здесь уже беру нужный файл и масштабирую). На фоне этого передача строки выглядит совершенно несущественной.

А это msg=[diff_msg] - что делает? Передает/принимает dictionary или как это называется?

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

Чистая функция - хорошо. Но такой трюк вполне позволителен и используется во многих других языках, таких как C, фортран, IDL и многих других. Моя функция делает хитрый расчет и возвращает картинку. За одно я хотел бы принимать сообщение-версию.

Мне ООП не нужно, мне нужно двигать науку и делать связанные вычисления. У нас специально выделенных программистов 4 штуки (я не из них) и они сами себе кухню напридумывали и в ней куховарят.

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

Строки в питоне неизменяемые (как и числа). А вот списки изменяемые. msg=[diff_msg] присваивает msg список из одного элемента, дальше этот элемент можно читать и менять.

На фоне этого передача строки выглядит совершенно несущественной.

Дело не в производительности, дело в дизайне. В питоне немножко свой оптимальный стиль работы. Хотя если эта функция фортрановская/сишная, то возвращать кортеж из двух значений довольно муторно, придется дергать PyAPI.

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

Ты покажи в справке, где выражение «a[n]» меняет что-то в строке для начала. А то я тебя отправлю сейчас кое-куда, год будешь правды искать.

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

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

Morin ★★★★★
()

https://docs.python.org/3/tutorial/controlflow.html#id2

зы. познавательно какое количество (подавляющее большинство) - успешно трудиться на ниве продуктивного питоно-использования зная сей язычок в объёме меньшем чем первые страницы туториала с официального сайта.

ззы. не может не радовать степень гуманности современного человечества.

qulinxao3 ★★
()

да в чём проблема та,

def foo( req ):
   if req[ 'method' ] == 'go':
      req[ 'state' ] = 'go'
   else:
      req[ 'state' ] = 'stop'
   return req

req = {}
req[ 'method' ] = 'go'
req = foo( req )
print( str( req ) )

# ...

req[ 'method' ] = 'stop'
req = foo( req )
print( str( req ) )
anonymous
()
Ответ на: комментарий от anonymous

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

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

или у стринга реплейс отвалился?

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

>>> s = 'qwe'
>>> s.replace('w', 'q')
'qqe'
>>> print(s)
qwe

или стринг перестал быть недолистом, но с которого можно дернуть индекс?

В огороде бузина, в Киеве дядька.

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

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

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

За такой трюк в сишке иной раз хочется найти разработчика функции и долго бить его ногами.

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

И? Там написано что они immutable, или ты читать не умеешь? Пруф.

Цитата для Ъ:

Strings are immutable sequences of Unicode code points.

peregrine ★★★★★
()

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

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

Объясняю для тех, кто ничего кроме С не видел. В питоне строки являются иммутабельными, на каждое изменение строки создается новая. Точно так же строки работают во многих других языках программирования.

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

Всем спасибо за плодотворную дискуссию.

В результате сделал return кортежа.

Чтобы дважды не вставать, отвечу здесь на кое-какие:

  • То, что у питона свои особенности - было понятно сразу. Но мои погроммисты нужных ЦУ мне не дали, пришлось разбираться на ходу;
  • Переписав кое-какой кусок научного кода с IDL на питоне могу сообщить, что он ни разу не удобнее. Есть своя специфика, да и только. Простота-легкость-скорость - как по мне нет никаких преимуществ;
  • Основы ООП тут ни при чем, особенности питона - это особенности питона;
  • Этому подтверждением отсутствие консенсуса в треде;
  • В том, что программист на С на любом языке напишет на С нет ничего неожиданного. И в случае с питоном, по-видимому, плохого. Вот если питонист на С - это да;
  • Я вообще для себя недавно открыл фортран и очень этому рад. Удобный, компилируемый, типизируемый. Для научных расчетов очень хорошо подходит, так как простой синтаксис, нормально-повернутые массивы, встроенные комплексные числа, сходу матричная арифметика (правда я ни докеры на нем не стартую, ни c postgress не общаюсь, ни REST API не использую);

Всем лучи добра

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

Я вообще для себя недавно открыл фортран и очень этому рад. Удобный, компилируемый, типизируемый. Для научных расчетов очень хорошо подходит,

Плюсы еще лучше подходят, но они гораздо заморочнее.

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

Ну если питон свежий, то я датаклассами люблю обмазаться...

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

Как говорил Нолик «плохой, но хороший… Понятно.»

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