Как изменить результат типа (объекта)? - PullRequest
5 голосов
/ 02 мая 2019

Я использую сторонний модуль Python, который делает что-то ужасное, например:

def foo(x):
    if type(x) is str:
        do_useful_thing()

У меня есть класс, который подклассов str:

class mystr(str):
   ....

Я хотел бы вызвать foo() на mystr экземпляре, но это не удалось, потому что type(mystr) != type(str).Можно ли как-нибудь сделать мой класс таким, чтобы type(mystr) == type(str) и, следовательно, получить foo, чтобы принять его?

Я знаю, что решение right предназначено для использования сторонним модулемisinstance, но, к сожалению, я не могу это изменить.

Ответы [ 3 ]

4 голосов
/ 02 мая 2019

Публикация в качестве ответа консенсуса из раздела комментариев: даже если бы можно было делать подобные вещи, это действительно плохая идея.Даже если вы заставите его работать в времени, это приведет к тому, что странные вещи сломаются где-то еще.

Правильный ответ - обратиться к автору сторонней библиотеки.и попытаться решить это с ними.Или, если возможно, раскошелиться на эту библиотеку и сохранить собственную версию, не имеющую этого ограничения.

4 голосов
/ 02 мая 2019

Вы можете взломать встроенную type для стороннего модуля.

Так что, если сторонний код такой:

# bar.py (a.k.a, crappy 3rd-party code)
def foo(x):
    if type(x) is str:
        return True
    return False

Вы можете написать что-то вроде этого:

import bar

class MyStr(str):
    pass

# Returns False.... BOOO!
bar.foo(MyStr())

def fake_type(a):
    if isinstance(a, MyStr):
        return str
    else:
        return type(a)

bar.type = fake_type

# This should now return True :-)
bar.foo(MyStr())

И не забудьте попросить стороннего производителя исправить его код, чтобы вы могли избавиться от этого взлома позже.

1 голос
/ 02 мая 2019

Это будет зависеть от того, как у вас есть подклассы str, но вполне возможно, что все, что вам нужно сделать, это временно ввести обратно в str ...

class mystr(str):
    def has_e(self):
        if 'e' in self:
            print('True')

def foo(value):
    if type(value) == str:
        print('You Rock')
    else:
        print('You Roll')

if __name__=='__main__':
    a = mystr('hi mom')
    a.has_e()
    foo(str(a))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...