LINUX.ORG.RU

Context

 


1

2

Вот к примеру есть такой код из учебника:

import zmq
host = '127.0.0.1'
port = 6789
context = zmq.Context()
client = context.socket(zmq.REQ)
client.connect("tcp://%s:%s" % (host, port))
for num in range(1, 6):
    request_str = "message #%s" % num
    request_bytes = request_str.encode('utf-8')
    client.send(request_bytes)
    reply_bytes = client.recv()
    reply_str = reply_bytes.decode('utf-8')
    print("Sent %s, received %s" % (request_str, reply_str))
Ни где не могу найти определения собственно концепции «Context» используемое в данном так сказать контексте. Видимо это не класс и не пространство имен и не модуль, что за отдельная сущность? В интернетах много пишут про менеджеры контекста или про переключение контекста процесса, но тут ведь какое-то другое значение контекста или нет?

★★★★★

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

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

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

Если скажешь название пакета, то можем посмотреть исходники :-)..

Если pyzmq — то https://github.com/zeromq/pyzmq/blob/master/zmq/sugar/context.py ...

...то Context это просто обычный класс , экземпляр которого (паттерн «Фабрика») создаёт другие объекты :-)

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

...для менеджера контекстов...

Как видишь по исходнику выше — у класса есть методы __enter__ и __exit__ ..

То есть экземпляр этого Класса можно использовать внутри with ..

Наверное примерно так:

with zmq.Context() as zmq_ctx:
     blahblahblah = zmq_ctx.blahblablah()
     ... ... ...

Поэтому наверно и такое название дали этой фабрике — «контекст»

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

у класса есть методы __enter__ и __exit__

То есть Context в данном контексте это класс, у которого есть методы __enter__ и __exit__
Или можно дать какое-то более полное определение?

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

Если скажешь название пакета, то можем посмотреть исходники :-).. Если pyzmq

Судя по звёздочке в выхлопе conda search zmq - да, стоит pyzmq
А как более по другому посмотреть?

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

Мне кажется нет строгого формального определения — какую именно сущность в библиотеке мы должны называть «контекст»..

Лично мне ближе вариант когла «контекстом» яволется какой-то объект, который хранит некий набор сопроводительной информации относительно этой библиотеки (__enter__ и __exit__ тут получается не обязательнвм требованием).. и который мы каждый раз упомянаем при вызове какой-то функции этой библиотеки..

..но разные разработчики — вносят немного разный смысл в это слово.

В Python — также есть менеджер-контекстов — в котором контекст это хрень которая умеет работать с with . то есть смысл пересекается но не такой как ближе мне..

Вобщем как кому нравится :-)

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

это просто название которое авторы дали классу исходя из его поведения, никакого формального определения тут нет, это котекст как Миша или Петя, а не как Старший Сержант, усек?

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

это просто название которое авторы дали классу исходя из его поведения

Что значит «просто дали»? В данном случае контекст назвали контекстом потому что он ходит как контекст и крякает как контекст вот только что такое контекст непрограммисту изучающему программирование по такому учебнику не очевидно, в отличие от тебя например, отсюда и вопрос.

af5 ★★★★★
() автор топика
[8:17] u@net13:~> cat /usr/ports/net/py-pyzmq/pkg-descr
PyZMQ is a lightweight and super-fast messaging library built on top of
the ZeroMQ library.

WWW: https://github.com/zeromq/pyzmq
[8:17] u@net13:~>
IPR ★★★★★
()
Ответ на: комментарий от IPR

Ну а как ты узнал, что импортируется именно оно?
Я вот вижу пока такой корявый путь:

>>> import zmq
>>> print(zmq.__file__)
head -3 /home/af5/anaconda3/lib/python3.6/site-packages/zmq/__init__.py
pip list 2>/dev/null |grep zmq
pip show pyzmq
и сравниваем всё это

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

Никак не узнал, налокатил что есть в портах.

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

но оп спрашивает, можно ли все что выглядит и крякает как, называть контекстом, так вот нет, потому-что это контекст как «кошка» а не как «кот Масик», правда теперь толкование наоборот, но все-же смысл от обратного верен

anonymous
()

Был бы жабапрограммистом, знал бы все про фабрики и фабрики фабрик.

buddhist ★★★★★
()

питон он весь такой, привыкай.

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

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

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

такое часто бывает :-) ..

называется: Java-програмист пишет скриптик на Python :-D ..

по факту — семантика языков Python и Ruby очень похожы — только в Python чуть больше порядка, а в Ruby чуть больше художественной свободы

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

Странно, что 10 наркоманских строк ты называешь «чуть больше порядка», а 2 простых и ясных строки ты называешь «больше художественной работы»...

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

Нет, ты не понял! 10 наркоманских строк это — «Java-програмист пишет скриптик на Python :-D ..»

В стандартной библиотеке Python ты такое не увидишь. А в дополнительных библиотеках — как повезёт.

Возможно из-за не-поощрения порядка — в ваш Ruby лезет *поменьше* Java-программистов .. Вот и вся формула успеха :-D ..

2 простых и ясных строки ты называешь «больше художественной работы»

«Больше художесивенной свободы» я называю Ruby-конторукции которые «большими мозками» делают помимо своего главного назначения — ещё и что-то побочное (чего не просили!)

Например require — вместе того чтобы запросить *только* требуемый модуль — запрашивает ещё и все зависимости (которые могут меняться от версии к версии — и по факту становится не ясно что именно теперь доступно\не_доступно в пространстве имён)

Или наример когда ты как свободный художник пишешь внутри метода вызов — foo() — и совершенно не ясно что именно вызывается (толи метод ролительского класса, толи функция из импортированного пространства имён)

А самое главное — нет, я наврал — Когда ты (как худодник) пишешь foo() , то ты ЗНАЕШЬ что именно ты вызываешь! А вот кто-то будет читать твой ruby-код — он уже может только угадывать :-D :-D

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

В стандартной библиотеке Python ты такое не увидишь. А в дополнительных библиотеках — как повезёт.

Мулька вся в том, что стандартные библиотеки питона вобще не позволяют ничего сделать. Например, работа с сокетами, упаковкой строк, работой с датой, терминалом, файлами, осью, потоками и т.д. в питоне требует дополнительных наркоманских классов (zmq, socket, struct, time, datetime, termios, fcntl, sys, os, threading),
в руби же всё это возможно из стандартных классов. Причём, программеру не нужно гадать как в питоне, а) методы там будут или функции, б) сколько промежуточных прослоек нужно нагородить, в) насколько всё это будет извращенски - в руби ты делаешь всегда одно и то же: берешь базовый класс, создаёшь объект и вызываешь метод, например:

client = TCPSocket.open('lor.ru', 6789)
client.send('Hello world')

Чтобы почувствовать «чуть больше порядка», присовокупи к этому работу с упаковкой строки и потоками (к-я неизбежна при работе с сокетами), и разница с руби станет очевидна.

пишешь foo() , то ты ЗНАЕШЬ что именно ты вызываешь! А вот кто-то будет читать твой ruby-код — он уже может только угадывать

Есть такая претензия. Но руби позволяет писать self.foo() для определённости, как в питоне. Другое дело, что это оставлено на выбор программиста. Если ты так хочешь, чтобы твой код был читабельным - пиши self.foo() и object.foo() везде.

UPD. И ещё один наркоманский косяк питона. В руби методы пишутся с маленькой буквы, а классы - с большой. В питоне же и классы, и методы - всё с маленькой, и такой код читается хреново, подсветка синтаксиса уже не может работать например:

import socket

sock = socket.socket()
sock.connect(('lor.ru', 6789))
sock.send('Hello world')

Сравни с тем, что выше.

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 2)
Ответ на: комментарий от user_id_68054

Далее, в руби работа с сокетами очевидна по именам классов (TCPSocket, TCPServer, UDPSocket), в питоне же везде используется socket.socket(parameters), сравни:

Ruby:

sock = UDPSocket.new
sock.send('Hello', 'lor.ru', 6789)

Python:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto('Hello', ('lor.ru', 6789))

1) непонятно, где название модуля? класса? метода? - всё маленькими буквами
2) непонятно, tcp это или udp, если не знать, что означает SOCK_DGRAM
3) а параметры как в питоне передаются, это вобще песня - где-то напрямую, а где-то через кортежи! :)

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

если не знать, что означает SOCK_DGRAM

С точки зрения человека который *знает* что такое сущность сокета в операционной системе — всё корректно. Там кроме udp и tcp --- есть и куча других видов сокетов (какой дурачёк будет для каждого из этих 15 видов сокетов — создавать по отдельному классу?)

непонятно, где название модуля? класса? метода? - всё маленькими буквами

что не понятно? Ты его импортировал толькочто! Импортировал и забыл?

Можно и так написать:

import socket as KOROVA

sock = KOROVA.socket(... ... ...)
... ... ...

и в этом случае *тоже* ясно где название модуоя, а где вызов функции.

Но ведь Ruby-программист ПРИВЫК УГАДЫВАТЬ! Поэтому тебе хочется обращать внимание на большую\маленькую букву или чтото-такое. Вместо того чтобы посмотреть что там написано в import .

А угадывать НЕ требуется (в случае с python). Всё видно из кода.

а параметры как в питоне передаются, это вобще песня - где-то напрямую, а где-то через кортежи! :)

Это тебя смутил тот факт что адрес может состоять либо из двух элементов (хост, порт) либо из одного (путь-юникс-сокета)?

А в Ruby как отправить пакет на адрес?...

...для случая когда адрес должен браться из переменной. И в этой переменной либо хост+порт, либо путь_юникс_сокета..

Покажешь этот костыль? :-) или стыдно?

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