Python Forum
trying to understand a string literal in a basic server program
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
trying to understand a string literal in a basic server program
#1
I have this code:

import socket

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(),1234))
s.listen(5)

while True:
    clientsocket, address = s.accept()
    print(f"Connection from {address} has been established!")

    msg = "Welcome to the server!"
    msg = f'{len(msg):<10{HEADERSIZE}}'+ msg

    clientsocket.send(bytes("msg", "utf-8"))

    while True:
        time.sleep(3)
        msg = f"The time is! {time.time()}"
        msg = f'{len(msg):<{HEADERSIZE}}' + msg
        clientsocket.send(bytes(msg, "utf-8"))
and i'm trying to understand this line: f{len(msg):<10{HEADERSIZE}}

so i opened my ide and i did this:

>>> msg = 'Hello World!'
>>> len(msg)
12
>>> len(msg):<10
SyntaxError: invalid syntax

for me it's pretty much the same thing so... why doen't it work?
Plus, if you remove the string literal in line fourteen, doesn't give : msg = 22:<10 10 + msg???

I tried to find an explanation on the web, but to no avail...
Could someone explain what's going on?
Could someone explain?
Reply
#2
This is using the format language for f-strings. The first bit inside the braces is the thing you want to evaluate (and print the str() representation of), and the second bit (after the colon) is the Format specification mini-language.

In your particular case the less-than sign indicates left alignment within the field and HEADERSIZE is evaluated and interpreted as the size of the field.

>>> headersize = 10
>>> n = 45
>>> f"{n}"
'45'
>>> f"{n:{headersize}}"
'        45'
>>> f"{n:<{headersize}}"
'45        '
Reply
#3
In the example below, both prints produce the same output:
import socket
HEADERSIZE=10
msg = "Welcome to the server!"
print(f'{len(msg):<10{HEADERSIZE}}+msg')  # {HEADERSIZE} will be replaced by 10
print(f'{len(msg):<1010}+msg')
So this makes a string that starts with len(msg) followed lots and lots of padding and finally "Welcome to the server!"
    msg = f'{len(msg):<10{HEADERSIZE}}'+ msg
The reason you got an error trying to evaluate "len(msg):<10" is that this is not Python code, it is f'string formatting code. Just like the syntax for regular expressions is not Python, the format syntax for f'strings is not Python. These are special purpose mini-languages for doing specific tasks.
Reply
#4
(Nov-13-2021, 11:55 PM)deanhystad Wrote: In the example below, both prints produce the same output:
import socket
HEADERSIZE=10
msg = "Welcome to the server!"
print(f'{len(msg):<10{HEADERSIZE}}+msg')  # {HEADERSIZE} will be replaced by 10
print(f'{len(msg):<1010}+msg')
So this makes a string that starts with len(msg) followed lots and lots of padding and finally "Welcome to the server!"
    msg = f'{len(msg):<10{HEADERSIZE}}'+ msg
The reason you got an error trying to evaluate "len(msg):<10" is that this is not Python code, it is f'string formatting code. Just like the syntax for regular expressions is not Python, the format syntax for f'strings is not Python. These are special purpose mini-languages for doing specific tasks.

if I write : f'{msg:<1010}' the first 10 stands for 10 charcaters and msg is inside those 10 characters, but what does the second 10 stands for? Does it multiply the first 10, because that's what it looks like when i put it in python
Reply
#5
iimport socket
HEADERSIZE=10
msg = "Welcome to the server!"
print(len(msg))
x = f'{len(msg):<10{HEADERSIZE}}'+msg
y = f'{len(msg):<1010}'+msg
print(len(x), len(y), x == y)
Output:
1032 1032 True
10{HEADERSIZE} ends up as 1010. The resulting string is 1032 characters long. 1010 character for the message length and padding and 22 characters for the message.

If I print x it looks like this:
Output:
22 Welcome to the server!
This is "22" followed by 1008 blanks and then "Welcome to the server!"
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Basic Coding Question: Exit Program Command? RockBlok 3 504 Nov-19-2023, 06:31 PM
Last Post: deanhystad
  How to take the tar backup files form remote server to local server sivareddy 0 1,871 Jul-14-2021, 01:32 PM
Last Post: sivareddy
  PLEASE HELP! Basic Python Program joeroffey 5 2,377 Apr-10-2021, 02:59 PM
Last Post: jefsummers
  EOF while scanning triple-quoted string literal louis216 1 3,884 Jun-30-2020, 04:11 AM
Last Post: bowlofred
  invalid literal for int() with base 10: '' mrsenorchuck 5 5,327 Apr-29-2020, 05:48 AM
Last Post: markfilan
  Python basic program webshakeup 4 2,730 Sep-19-2019, 07:14 AM
Last Post: Maheshsharma
  Syntax Error EOL while scanning string literal intjuma 0 2,464 Jun-28-2019, 01:56 AM
Last Post: intjuma
  Heating program to translate from Basic to Python tommy2k19 12 5,838 May-21-2019, 08:16 AM
Last Post: tommy2k19
  Very Basic String Manipulation gstu 2 2,638 Mar-18-2018, 03:08 PM
Last Post: gstu
  SyntaxError: EOL while scanning string literal on with open() statement Regulus 3 7,314 Feb-23-2018, 06:40 PM
Last Post: nilamo

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020