can't concatenate strings in Python-3
Question: when running this script in Python-3:

    
    
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import socket
    import random
    import os
    import threading
    import sys
    
    class bot(threading.Thread):
       def __init__( self, net, port, user, nick, start_chan ): 
           self.id= random.randint(0,1000)
           self.irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
           self.irc_connect ( net, port )
           self.irc_set_user( user,nick )
           self.irc_join( start_chan )
           self.finnish=False
           threading.Thread.__init__(self)
    
       def run( self ):
           while not self.finnish:
               serv_data_rec = self.irc.recv ( 4096 )
               if serv_data_rec.find ( "PING" ) != -1:
                   self.irc.send( "PONG"+ serv_data_rec.split() [ 1 ] + "\r\n" )
    
               elif serv_data_rec.find("PRIVMSG")!= -1:
                   line = serv_data_rec.split( "!" ) [ 0 ] + " :" + serv_data_rec.split( ":" ) [ 2 ]
    
                   self.irc_log( line )
                   self.irc_message( line )
    
       def stop( self ):
           self.finnish = True
           self.irc_quit()
    
       def irc_connect( self, net, port ):
           self.net = net
           self.port = port
           self.irc.connect ( ( net, port ) )
    
       def irc_set_user( self, user, nick ):
           self.user = user
           self.nick = nick
           self.irc.send( "NICK " + nick + "\r\n" )
           self.irc.send( "USER " + user + "\r\n" )
    
       def irc_join( self, chan ):
           self.chan = chan
           self.irc.send( "JOIN " + chan + "\r\n" )
    
       def irc_message( self, msg ):
           self.irc.send( "PRIVMSG " + self.chan+" " + msg + " \r\n" )
    
       def irc_message_nick( self, msg , nick):
           self.irc.send( "PRIVMSG " + self.chan+" " + nick + " " + msg + " \r\n" )
    
       def irc_ping( self ):
           self.irc.send("PING :" + self.net)
    
       def irc_log( self, line ):
           if not os.path.exists("./logs"):
               os.makedirs("./logs")
           f = open("./logs/" + self.net + self.chan + "#" + "% s" %self.id,'a')
           try:
               f.write( line )
           finally:
               f.close()
    
       def irc_quit( self ):
           self.irc.send( "QUIT\r\n" )
    
       def irc_quit_msg(self, msg):
           self.irc.send( "QUIT :" + msg + "\r\n" )
    
    def main():
        bot_main= bot( "irc.freenode.net",6667,"botty botty botty :Python IRC","hello_nick","#martin3333" )
        bot_main.start()
        while 1:
            inp = raw_input()
            if inp =="!QUIT": 
                bot_main.stop()
                break
        sys.exit(0)
    
    if __name__ == '__main__': main()
    

I get the following traceback:

    
    
    File "./hatebozzer.py", line 84, in <module>
        if __name__ == '__main__': main()
    File "./hatebozzer.py", line 75, in main
        bot_main= bot( "irc.freenode.net",6667,"botty botty botty :Python IRC","hello_nick","#martin3333" )
    File "./hatebozzer.py", line 14, in __init__
        self.irc_set_user( user,nick )
    File "./hatebozzer.py", line 43, in irc_set_user
        self.irc.send( "NICK " + nick + "\r\n" )
    TypeError: 'str' does not support the buffer interface
    

I know that strings are treated completly differently in Python 3, but I am
not trying to convert strings or do anything exotic. I just want to
concatenate them, so what did I wrong here?


Answer: `send` wants a sequence of `bytes` as its argument.

In Python2, `"NICK " + nick + "\r\n"` is a sequence of bytes. But in Python3,
it is a `str`, which in Python2 would have been called a `unicode`. In Python3
this is not a sequence of bytes.

In Python3, to convert the `str` to a sequence of bytes, apply an encoding:

    
    
    ("NICK " + nick + "\r\n").encode('utf-8')
    

or (to follow best practices, use `format` instead of `+`):

    
    
    "NICK {n}\r\n".format(n=nick).encode('utf-8')
    

