Ошибка «Отсутствует один позиционный параметр», но присутствуют все параметры - PullRequest
0 голосов
/ 18 октября 2019

Исходный код работает:

import requests
from api.signals_add import SignalsAdd

class TestLogin:

    def test_log_in(self):
        url = 'https://api.stg.nuroblock.com/api/admin/auth/login'
        data = {"email": "admin02@thinkmelius.com", "password": "123123"}

        r = requests.post(url, json=data)
        assert 200 == r.status_code

    def test_create_signal(self):
        json_for_create_signal = {
                "signalType": "crypto",
                "currencyFrom": "5c1e4633b140f7000f908897",
                "currencyTo": "5c1e4633b140f7000f908898",
                "currencyPair": "5cbd7faf496a8c001124ed5b",
                "type": "sell",
                "buyTip": {"value": 21313},
                "stopTip": 21312.9999,
                "stopTipPips": "-1",
                "takeProfits": [{"value": 21313.0111, "isAchieved": False, "closeOnReach": False, "pips": "+111"}],
                "status": "active",
                "orderType": "market"
        }

        result = requests.post("https://api.stg.nuroblock.com/api/admin/signals",
                               json=json_for_create_signal,
                               headers={'Authorization': 'Bearer ea3d14e631683062073186622d58d2a16HSGB9JDC0ZYtELpwEGL8eNma36EdXei/B72NOa5Y5ln0Sn3+BsWoZdNxK7L2LO4',
                                        'Content-Type': 'application/json'})
                              'Content-Type': 'application/json'})

Но, когда я разделил его на два класса - класс API и класс Test, последний параметр не может быть найден

класс API

import requests
class SignalsAdd:

    def create_signal(self, signalType, currencyFrom, currencyTo, currencyPair,
                            type, buyTip, stopTip, stopTipPips, takeProfits_value,
                            isAchieved, closeOnReach, pips,
                            status, orderType):

        json_for_create_signal = {
                "signalType": signalType,
                "currencyFrom": currencyFrom,
                "currencyTo": currencyTo,
                "currencyPair": currencyPair,
                "type": type,
                "buyTip": {"value": buyTip},
                "stopTip": stopTip,
                "stopTipPips": stopTipPips,
                "takeProfits": [{"value": takeProfits_value, "isAchieved": isAchieved, "closeOnReach": closeOnReach,
                                 "pips": pips}],
                "status": status,
                "orderType": orderType
        }

        result = requests.post("https://api.stg.nuroblock.com/api/admin/signals",
                               json=json_for_create_signal,
                               headers={'Authorization': 'Bearer ea3d14e631683062073186622d58d2a16HSGB9JDC0ZYtELpwEGL8eNma36EdXei/B72NOa5Y5ln0Sn3+BsWoZdNxK7L2LO4',
                                        'Content-Type': 'application/json'})

        assert result.status_code == 201
        response_json = result.json()
        print(response_json)

Тестовый класс

class TestLogin:

    def test_log_in(self):
        url = 'https://api.stg.nuroblock.com/api/admin/auth/login'
        data = {"email": "admin02@thinkmelius.com", "password": "123123"}

        r = requests.post(url, json=data)
        assert 200 == r.status_code

    def test_create_signal(self):

        add_signal = SignalsAdd.create_signal("crypto", "5c1e4633b140f7000f908897", "5c1e4633b140f7000f908898",
                                              "5cbd7faf496a8c001124ed5b", "sell", 21313, 21312.9999, "-1", 21313.0111,
                                              False, False, "+111", "active", "market")

Я получаю эту ошибку: TypeError: create_signal() missing 1 required positional argument: 'orderType'

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Я думаю, что явная передача себя может быть причиной проблемы. При вызове функции попробуйте передать значения с именем переменной и посмотреть, что вы получите. Здесь, по крайней мере, вы будете знать, какие значения переданы по какой переменной, а какие отсутствуют.

Как это

        add_signal = SignalsAdd.create_signal(signal_type="crypto", currencyfrom="5c1e4633b140f7000f908897", ...)
0 голосов
/ 18 октября 2019
SignalsAdd.create_signal(...

SignalsAdd - это класс, а не экземпляр этого класса. При попытке вызвать метод таким способом он обрабатывается как простая функция;таким образом, строка "crypto" становится значением для self (а не signalType) и т. д. Более простой пример:

>>> class x:
...   def func(self, y):
...     print('self:', self, 'y:', y)
...
>>> x.func(2) # wrong
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() missing 1 required positional argument: 'y'
>>> x.func(1, 2) # trying to fix it, but not really proper
self: 1 y: 2
>>> x().func(2) # create an x instance, and use its method
self: <__main__.x object at 0x0000027AF1057320> y: 2

Альтернативно, вещи, которые следует вызывать без экземпляра, могут быть украшены@classmethod (класс будет передан в качестве первого параметра, а не экземпляра; это позволяет вам по-прежнему изменять поведение для подклассов):

>>> class x:
...   @classmethod
...   def func(cls, y): # we rename the argument for clarity.
...     print('class:', cls, 'y:', y)
...
>>> x.func(2) # It works with either the class...
class: <class '__main__.x'> y: 2
>>>
>>> x().func(2) # or an instance; the instance's class is looked up.
class: <class '__main__.x'> y: 2

Или как @staticmethod (ничего не передается, ион просто помещает обычную функцию в пространство имен класса):

>>> class x:
...   @staticmethod
...   def func(y):
...     print('y:', y)
...
>>> x.func(2) # it also works either way, but there is no extra value
y: 2
>>> x().func(2) # passed automatically, so no way to check the subclass.
y: 2

Однако, есть хорошие шансы, что вы действительно не хотели, чтобы класс вообще был . Это не Java;простые функции на верхнем уровне работают просто отлично и часто являются лучшим инструментом для работы.

...