Концентратор событий Azure - TypeError: super (type, obj): obj должен быть экземпляром или подтипом типа - PullRequest
0 голосов
/ 05 февраля 2019

Python версии 3.7.1 uamqp-1.1.0

Помогите нам, пожалуйста, у нас есть эта ошибка в uamqp / client.py, строка 453, в init :

super (SendClient, self). init (TypeError: super (type, obj): obj должен быть экземпляром или подтипом типа

Это происходит потому, чтоиз sender = client.add_sender(partition="0")

Вот код:

import sys
import logging
import datetime
import time
import os

from azure.eventhub import EventHubClient, Sender, EventData

logger = logging.getLogger("azure")

ADDRESS = "amqps://xxx.servicebus.windows.net/xxx"
USER = "xxx"
KEY = "xxx"

try:
    if not ADDRESS:
        raise ValueError("No EventHubs URL supplied.")

    # Create Event Hubs client
    client = EventHubClient(ADDRESS, debug=False, username=USER, password=KEY)
    sender = client.add_sender(partition="0")
    #self = <class 'uamqp.client.SendClient'>
    client.run()
    try:
        start_time = time.time()
        for i in range(10):
            print("Sending message: {}".format(i))
            #sender.send(EventData())
    except:
        raise
    finally:
        end_time = time.time()
        client.stop()
        run_time = end_time - start_time
        logger.info("Runtime: {} seconds".format(run_time))

except KeyboardInterrupt:
    pass

Большое вам спасибо !!

Проблема, связанная с Github: https://github.com/Azure/azure-event-hubs-python/issues/93

1 Ответ

0 голосов
/ 06 февраля 2019

Существует SO-поток super (type, obj): obj должен быть экземпляром или подтипом типа , ответы на которые приводят множество случаев, которые будут вызывать проблемы, такие же, как у вас.

После того, как я искал исходные коды Azure/azure-event-hubs-python и Azure/azure-uamqp-python, я думаю, что ваша проблема была вызвана кодом ниже в uamqp/client.py#L470, которые связанык ответу из ветки SO над сообщением @ Eldamir.

    super(SendClient, self).__init__(
        target,
        auth=auth,
        client_name=client_name,
        debug=debug,
        error_policy=error_policy,
        keep_alive_interval=keep_alive_interval,
        **kwargs)

Другой интересный способ - если слияние ветвей дублирует класс, так что в файле есть два определения длято же имя, например

class A(Foo):
    def __init__(self):
        super(A, self).__init__()
        #...

class A(Foo):
    def __init__(self):
        super(A, self).__init__()
        #...

Если вы попытаетесь создать экземпляр из статической ссылки на первое определение A, как только он попытается вызвать super, внутри метода init , Aбудет ссылаться на второе определение A, поскольку оно было перезаписано.Решение, конечно же, состоит в том, чтобы удалить дублирующееся определение класса, чтобы оно не перезаписывалось.

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

Так что, я думаю, что былоопределенный вами класс SendClient, который вызывает конфликт имен с SendClient классом в uamqp/client.py.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...