LINUX.ORG.RU

Python [б-код]


0

0
import threading, time, socket

def ProcessMessage(m, conn):
	prefix = m[:4]
	if prefix == '/msg':
		print "message: ", m[4:] 
		conn.send(m[4:])
	elif prefix == '/dsc':
		print "disconnect"
		conn.close()

class Connection():
    def __init__(self, id):
        self.id = id
    def disconnect(self):
        self.id.close()
    pm = ProcessMessage

class ServerThread(threading.Thread):
	def __init__(self, channel, details):
		self.channel = channel
		self.details = details
		threading.Thread.__init__(self)
                client = Connection(self.channel)
	def run(self):
		print 'Connection from:', self.details[0]
        while True:
            client.pm(self.channel.recv(255), self.channel)

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 3333))
server.listen(5)

while True:
	channel, details = server.accept()
	ServerThread(channel, details).start()

Пытаюсь написать примитивный чат.
Скажите, почему python ругается на «client = Connection(self.channel)»?
Спасибо.
P.S. python не знаю, пишу параллельно со чтением доков.


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

у меня - вот так:

power@power:~> python server.py
Traceback (most recent call last):
  File "server.py", line 19, in <module>
    class ServerThread(threading.Thread):
  File "server.py", line 24, in ServerThread
    client = Connection(self.channel)
NameError: name 'self' is not defined

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

Действительно, что-то с отступами случилось.
Но в редакторе код нормально отображался. теперь ошибка

power@power:~> python server.py
Traceback (most recent call last):
  File "server.py", line 19, in <module>
    class ServerThread(threading.Thread):
  File "server.py", line 28, in ServerThread
    client.pm(self.channel.recv(255), self.channel)
NameError: name 'client' is not defined

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

> Че еще за not defined

Даже не знаю, что тебе сказать %) Переменная не определена, что непонятно?

и как с этим бороться?

Судя по коду, там должно быть self.client (и в __init__ тоже).

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

>> Переменная не определена, что непонятно?

А почему так?

Блин. Покажи мне место в run, где ты определил переменную client.

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

Может стоит начать не с клиент-серверных чатов, а с чего-нибудь попроще? Ну там, почитать про переменные, функции, пописать сортировку пузырьком...

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

Я не до такой степени нуб :) Сортировку пузырьком написать могу. А понять, почему вот этот код работает, в отличие от вышеприпеденного - не могу.

import threading, time, socket

class ServerThread(threading.Thread):
def __init__(self, channel, details):
self.channel = channel
self.details = details
threading.Thread.__init__(self)

def run(self):
print 'connection:', self.details[0]
while True:
ProcessMessage(self.channel.recv(255), self.channel)

def ProcessMessage(m, conn):
prefix = m[:4]
if prefix == '/msg':
print "message: ", m[4:]
conn.send(m[4:])
elif prefix == '/dsc':
print "disconnect"
conn.close()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 3333))
server.listen(5)

while True:
channel, details = server.accept()
ServerThread(channel, details).start()

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

Пример. К своему случаю сам приспособишь. Тут x - локальная переменная метода __init__:

class MyClass:
    def __init__(self):
        x = 1

Здесь - переменная экземпляра:

class MyClass:
    def __init__(self):
        self.x = 1

Переменная класса, значение общее для всех экземпляров:

class MyClass:
    value = 0

    def __init__(self):
        pass

MyClass.value = 2

e1 = MyClass()
print e1.value # => 2

Почитай хотя бы тот же «Dive Into Python».

ipc ()

Как же я ненавижу когда постят такие угадайки: «У меня не пашет код ... ругается на эту строчку. Что у меня не так?». Чес слово, устал.
Первое правило при кодинге на ЛЮБОМ языке - ВКЛЮЧАЙТЕ ПРОСМОТР ОТСТУПОВ/ПРОБЕЛОВ/ТАБОВ!111
Если у тебя будет одна строчка с отступом по пробелам, а другая, дочерняя, по табу, то пайтон может долго ругаться так что ты можешь вечно искать проблему.

Че еще за not defined и как с этим бороться?

С английским как? Никак? А с скиллом «умение гуглить»? Либо первое, либо второе. Используй, качай скилл. Иначе не быть тебе кодером.

А почему так?

Это ты себе должен задать вопрос. Ты же программист. Интерпритатор говорит что переменная не определена, значит только программист знает почему он её не определил. Почему ты спрашиваешь такое у бедных ЛОРовцев?

ipc молодец, не поленился расписать пример.

Лично я могу прокомментировать данный код с ошибкой таким образом:
Отступы. Не миксуй табы и пробелы. Хотя бы в одной ветке кода(это когда ты начинаешь код с строки без отступа + все его дочерние строчки, которые «принадлежат» ему(коду)).
В данном случае строчка «client = Connection(self.channel)» была с отступом по табу, что, конечно, пайтон не смог понять и отнёс к детям строчки «class ServerThread(threading.Thread):», что, конечно, вызвало ошибку, ибо self не существует в данном scope.

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

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

С английским как? А с скиллом «умение гуглить»?

С английским языком и гуглом - отлично.

Иначе не быть тебе кодером.

Успокойся, на твою работу за тарелку супа я не претендую :)

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