首页 > 解决方案 > TypeError: __init__() 接受 1 个位置参数,但给定了 2 个 Python

问题描述

from locust import HttpLocust, TaskSet, task, between, events, Locust, User, HttpUser
import vertica_python
import time, logging

def get_sample_query():
    query = '''
        SELECT COUNT(*) FROM tst.test_table'''

    conn = {
        'host': os.environ['vertica_host'],
        'port': os.environ['vertica_port'],
        'database': os.environ['vertica_database'],
        'user': os.environ['vertica_user'],
        'password': os.environ['vertica_password'],
        'read_timeout': 600,
        'unicode_error': 'strict',
        'ssl': False
    }
    return conn, query
    
def execute_query(conn_info, query):
    with vertica_python.connect(**conn_info) as conn:
        cur = conn.cursor()
        cur.execute(query)
        return [x for x in cur.iterate()]


class VerticaClient:
    def __getattr__(self, name):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            try:
                res = execute_query(*args, **kwargs)
                self._locust_environment.events.request_success.fire(request_type="vertica",
                                            name=name,
                                            response_time=int((time.time() - start_time) * 1000),
                                            response_length=len(res))
            except Exception as e:
                 self._locust_environment.events.request_failure.fire(request_type="vertica",
                                            name=name,
                                            response_time=int((time.time() - start_time) * 1000),
                                            exception=e)

            logging.info('error {}'.format(e))
        return wrapper


class VerticaTaskSet(TaskSet):
    @task
    def execute_query(self):
        self.client.execute_query(get_sample_query()[0], get_sample_query()[1])


class VerticaLocust(HttpUser):
    tasks = [VerticaTaskSet]
    wait_time = between(0.1, 1)

    def __init__(self):
        super(VerticaLocust, self).__init__()
        self.client = VerticaClient()

您好,我正在尝试使用上面的代码对 Vertica 数据库进行压力测试,但是,当我运行 python 文件时,出现以下错误:“TypeError:init () 采用 1 个位置参数,但给出了 2 个”。我已经进行了一些研究,但无法确定修复方法,有人可以提供建议/帮助吗?谢谢!

[2020-10-08 14:53:29,338] LAPTOP/WARNING/locust.main: System open file limit setting is not high enough for load testing, and the OS didn't allow locust to increase it by itself. See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-number-of-open-files-limit for more info.
[2020-10-08 14:53:29,339] LAPTOP/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2020-10-08 14:53:29,358] LAPTOP/INFO/locust.main: Starting Locust 1.2.3
[2020-10-08 14:53:31,799] LAPTOP/INFO/locust.runners: Spawning 2 users at the rate 2 users/s (0 users already running)...
Traceback (most recent call last):
  File "src/gevent/greenlet.py", line 854, in gevent._gevent_cgreenlet.Greenlet.run
  File "c:\users\john\appdata\local\programs\python\python39\lib\site-packages\locust\runners.py", line 417, in <lambda>
    lambda: super(LocalRunner, self).start(user_count, spawn_rate, wait=wait)
  File "c:\users\john\appdata\local\programs\python\python39\lib\site-packages\locust\runners.py", line 299, in start
    self.spawn_users(user_count, spawn_rate=spawn_rate, wait=wait)
  File "c:\users\john\appdata\local\programs\python\python39\lib\site-packages\locust\runners.py", line 194, in spawn_users
    spawn()
  File "c:\users\john\appdata\local\programs\python\python39\lib\site-packages\locust\runners.py", line 187, in spawn
    new_user = user_class(self.environment)
TypeError: __init__() takes 1 positional argument but 2 were given
2020-10-08T13:53:31Z <Greenlet at 0x203ee5c68c0: <lambda>> failed with TypeError

[2020-10-08 14:53:31,820] LAPTOP/CRITICAL/locust.runners: Unhandled exception in greenlet: <Greenlet at 0x203ee5c68c0: <lambda>>
Traceback (most recent call last):
  File "src/gevent/greenlet.py", line 854, in gevent._gevent_cgreenlet.Greenlet.run
  File "c:\users\john\appdata\local\programs\python\python39\lib\site-packages\locust\runners.py", line 417, in <lambda>
    lambda: super(LocalRunner, self).start(user_count, spawn_rate, wait=wait)
  File "c:\users\john\appdata\local\programs\python\python39\lib\site-packages\locust\runners.py", line 299, in start
    self.spawn_users(user_count, spawn_rate=spawn_rate, wait=wait)
  File "c:\users\john\appdata\local\programs\python\python39\lib\site-packages\locust\runners.py", line 194, in spawn_users
    spawn()
  File "c:\users\john\appdata\local\programs\python\python39\lib\site-packages\locust\runners.py", line 187, in spawn
    new_user = user_class(self.environment)
TypeError: __init__() takes 1 positional argument but 2 were given

标签: pythonverticalocust

解决方案


实际上,您想创建自己的 locust 类,因此您需要从 User以前的版本继承Locust。所以你需要像这样改变你的班级:

class VerticaLocus(User):
    wait_time = between(0.1, 1)
    tasks = [VerticaTask]

    def __init__(self, environment):
        super().__init__(environment)
        self.client = VerticaClient()

为什么,因为我相信我们正在遵循相同的教程。


推荐阅读