LINUX.ORG.RU

Чтобы функция возвращала тот же тип, что и на входе, можно использовать несколько подходов в зависимости от того, какие типы вы хотите поддерживать. Вот пример реализации на Python, который возвращает тот же тип, что и на входе:

def return_same_type(value):
    # Получаем тип входного значения
    value_type = type(value)
    
    # Если это строка, пытаемся преобразовать её в число
    if value_type is str:
        try:
            return int(value)
        except ValueError:
            try:
                return float(value)
            except ValueError:
                return value  # Если не удалось преобразовать, возвращаем исходную строку
    
    # Если это число, преобразуем его в строку
    elif value_type is int or value_type is float:
        return str(value)
    
    # Для других типов возвращаем значение как есть
    return value

# Примеры использования:
print(return_same_type('234'))  # Вернёт 234 (int)
print(return_same_type(234))    # Вернёт '234' (str)
print(return_same_type(23.4))   # Вернёт '23.4' (str)
print(return_same_type('abc'))  # Вернёт 'abc' (str, так как не удалось преобразовать в число)

Объяснение:

  1. Определение типа входного значения: Используем type(value), чтобы определить тип входного значения.
  2. Обработка строк: Если входное значение — строка, пытаемся преобразовать её в целое число (int), а если не получается — в число с плавающей точкой (float). Если оба преобразования не удаются, возвращаем исходную строку.
  3. Обработка чисел: Если входное значение — целое число (int) или число с плавающей точкой (float), преобразуем его в строку (str).
  4. Другие типы: Для всех остальных типов возвращаем значение как есть.

Если нужно поддерживать пользовательские типы:

Если вы хотите поддерживать пользовательские типы, которые могут иметь свои методы __str__ или __repr__, можно использовать следующий подход:

def return_same_type(value):
    value_type = type(value)
    
    if value_type is str:
        try:
            return int(value)
        except ValueError:
            try:
                return float(value)
            except ValueError:
                return value
    elif value_type is int or value_type is float:
        return str(value)
    else:
        # Для пользовательских типов вызываем __str__ или __repr__
        return str(value)  # или repr(value), в зависимости от того, что вам нужно

# Пример с пользовательским типом:
class MyClass:
    def __str__(self):
        return "MyClass instance"

    def __repr__(self):
        return "MyClass()"

obj = MyClass()
print(return_same_type(obj))  # Вернёт "MyClass instance" (str)

В этом случае, если входное значение — это объект пользовательского класса, будет вызван его метод __str__ (или __repr__, если вы используете repr(value)), и результат будет возвращён как строка.р

anonymous
()
class Foo:
   def __init__(self) -> None:
      self.a = 0
      self.b = 0   
 
   @classmethod
   def from_json(cls, val: json_str) -> Self:
       f = cls()
       data = json.loads(str)
       f.a = data["a"]
       f.b = data["b"]
       return f
       
FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от anonymous

Q: How do I let the computer decide what the the answer type the answer is?

A: Trust me: You do not want the computer to decide.

:)

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

обаргуменчивание из командной строки мультипроцесса при вызове из под if главное имя в дандерах:

было

g(*(int(a) for a in sys.argv[-2:]))

прикручивание строки(имя для перенапа stder не через щель а унутри ) стало

g(*(t(a) for t,a in zip((int,int,str),sys.argv[-3:])))

вот находу и экспромптнулось а как чище когда нейтрально

qulinxao3 ★☆
() автор топика
Ответ на: комментарий от anonymous

для repl-творчества (изначальный reload по горячему (теперь сломано ибо пакетов не было) input не raw был

eval(' '.join(sys.argv))

Очевидно не для джунглей

[upd:]

Гея мыслит эонами

qulinxao3 ★☆
() автор топика
Последнее исправление: qulinxao3 (всего исправлений: 1)
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария