Azure事件中心-TypeError:super(type,obj):obj必须是类型的实例或子类型

时间:2019-02-05 11:11:42

标签: python python-3.x azure azure-eventhub azure-eventhub-capture

Python版本3.7.1 uamqp-1.1.0

请帮助我们,我们在uamqp / client.py的453行中,在 init 中出现此错误:

  

super(SendClient,自身)。初始化(   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 :(得分:0)

有一个SO线程super(type, obj): obj must be an instance or subtype of type,答案中介绍了许多会导致与您相同的问题的情况。

我搜索了Azure/azure-event-hubs-pythonAzure/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类发生名称冲突。