Пытаюсь сделать свою командную строку, но она не обрабатывает команды

import os
import random


def alert(a):
    print(f"---{a}")


def randnum(frm, to):
    num = random.randint(frm, to)
    alert(num)


while True:
    Запрос = input(">>> ")
    Запрос_аргументы = Запрос.split(" ")
    if Запрос_аргументы[0] is "randnum":
        randnum(int(Запрос_аргументы[1]), int(Запрос_аргументы[2]))
    else:
        alert("Такой команды нет, либо вы ввели ее неправильно!")

Я проверил все что можно, здесь все идеально. Но когда я ввожу эту самую команду "randnum", то она выдает мне else. Помогите пожалуйста!


Ответы (1 шт):

Автор решения: Amgarak

У вас ошибка в выборе оператора сравнения.

Операторы is и == в Python выполняют похожие функции, но работают немного по-разному.

== проверяет, равны ли значения двух операндов. В данном контексте — переменных, занимающих разные ячейки памяти. Этот оператор можно использовать для сравнения практически любых объектов: строк, списков, словарей и кортежей.

is() проверяет, являются ли два операнда одним и тем же объектом, то есть указывают ли они на один и тот же объект в памяти. Что для данного примера не подходит.

import os
import random


def alert(a):
    print(f"---{a}")


def randnum(frm, to):
    num = random.randint(frm, to)
    alert(num)


while True:
    Запрос = input(">>> ") 
    Запрос_аргументы = Запрос.split(" ")
    if Запрос_аргументы[0] == "randnum": # Вот тут меняем is на ==
        randnum(int(Запрос_аргументы[1]), int(Запрос_аргументы[2]))
    else:
        alert("Такой команды нет, либо вы ввели ее неправильно!")

Так же вам стоит добавить дополнительные проверки для Запрос_аргументы[1] и [2], что бы в случае их отсутствия программа не сыпалась.

Как еще один вариант, вместо == можно использовать оператор in для проверки вхождения строки в список строк. Вот как это может выглядеть в коде:

if Запрос_аргументы[0] in ["randnum"]:
→ Ссылка