Этот сценарий берет все, что было введено, и форматирует его в формат типа "1/1"
.
Он работает с первыми двумя операторами elif
, но при переходе к третьему по-прежнему присваивает 2/
перед номерами. Он должен перейти на 3/
и 4/
, как вы видите ниже.
Ваша помощь очень ценится.
import re
port = input("Enter port number:")
if bool(re.search('/', port)) == True:
p = port
elif int(port) <= 48:
port = "1/" + str(port)
elif int(port) >= 53 <= 100:
port = "2/" + str(port)
elif int(port) >= 105 <= 152:
port = "3/" + str(port)
elif int(port) >= 157 <= 204:
port = "4/" + str(port)
print(port)
где вы используете переменную p? Я вижу, что вы назначаете его (когда re.search возвращает True), но никогда не используете его.
Этот сценарий - небольшая часть того, что будет использоваться позже. Вот почему вы видите переменную p. Я не мог двигаться дальше, пока сначала не выяснил эти шаги.
Проблема в том, что вы пытаетесь связать сравнения:
elif int(port) >= 53 <= 100:
Это проверяет, есть ли int(port) >= 53
и 53 <= 100
. Поскольку 53 <= 100
всегда истинен, этот блок поймает все, где int(port) >= 53
. Я предполагаю, что вы собираетесь сделать следующее:
elif 53 <= int(port) <= 100:
Это будет ловить только те случаи, когда int(port)
находится в диапазоне от 53 до 100 (включительно). Вам нужно будет внести аналогичные изменения в остальные блоки elif
.
Это сработало. Потрясающие!
Вы перепутали условные операторы if. Исправить:
def getPort(port):
# https://stackoverflow.com/questions/12265451/ask-forgiveness-not-permission-explain
# only convert to int once, if that does not work check for / else bail out
try:
p = int(port)
except ValueError:
if "/" in port: # no need for regex
return port
else:
raise ValueError("Port either integer or somthing with / in it")
if p <= 48: # 49-52 are not covered
port = "1/" + port
elif 53 <= p <= 100: # move the condition between, the way you did it theyre True
port = "2/" + port # no matter because 53 <= 100 all the time
elif 105 <= p <= 152: # 101-104 are not covered
port = "3/" + port
elif 157 <= p <= 204: # 152-156 are not covered
port = "4/" + str(port)
else:
raise ValueError("Port either integer or somthing with / in it")
return port
for p in ["1","54","99","121","180","47/11","2000"]:
try:
print(getPort(p))
except ValueError as e:
print (e)
Выход:
# Input: ["1","54","99","121","180","47/11","2000"]
1/1
2/54
2/99
3/121
4/180
47/11
Port either integer or somthing with / in it
У вас есть несколько пропущенных диапазонов портов, 50 ф. Е. не покрывается и приведет к ошибке ValueError.
Ваша ошибка здесь:
elif int(port) >= 53 <= 100:
Это означает (вы можете прочитать о связанные операторы сравнения):
elif int(port) >= 53 and 53 <= 100:
и всегда будет True
из-за второй части; так вот почему более поздние elif
никогда не достигаются.
Мое предложение:
port = input("Enter port number:")
int_port = int(port) # so we don't repeat the same operation multiple unnecessary times
if bool(re.search('/', port)):
pass
elif int_port <= 48:
port = "1/" + port
elif 53 <= int_port <= 100:
port = "2/" + port
elif 105 <= int_port <= 152:
port = "3/" + port
elif 157 <= int_port <= 204:
port = "4/" + port
print(port)
@PatrickArtner Я так не думаю. Я добавил ссылку на документы python в свой ответ, и третий абзац в этом связанном разделе показывает это с использованием AND
.
Я был неправ, извините.
port = "1/" + str(port)
... порт уже является str ...