Как передать аргумент self в python cProfile - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь использовать cProfiling с python.

Мой python проект имеет следующую структуру каталогов:

my-project
├── src
│   ├── lib 
│       └── app
│           └── data
│               └── car_sim.py
│
│
│
│
├── ptests 
│   ├── src 
│       └── lib 
│           └── app
│               └── data
│                   └── cprofile_test.py

У меня есть функция внутри car_sim.py , которую я хочу создать, и она называется " sim_text». Он содержит функцию с именем:

#car_sim.py
import os

class RootSimulator:

    def sim_text(self, text):
            return text

Я использую следующий код внутри cprofile_test.py :

#cprofile_test.py
import cProfile
import pstats
import io

import src.lib.app.data.car_sim as car_sim_functions


pr = cProfile.Profile()
pr.enable()
text = 'my blabla sentence' #i can pass in this text below i guess...

#how do i pass to the below????!!
my_result = car_sim_functions.RootSimulator.sim_text()

pr.disable()
s = io.StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('tottime')
ps.print_stats()

with open('test.txt', 'w+') as f:
    f.write(s.getvalue())

Теперь ... когда я запускаю его с помощью команда

python -m cProfile ptests / src / lib / app / data / cprofile_test.py

Я получаю следующую ошибку:

TypeError: sim_text () отсутствует 2 обязательных позиционных аргумента: 'self' и 'text'

Мой вопрос ... Он ожидает 2 аргумента, так как мне передать «Я» Арг. Для 2-го аргумента «текст» я могу передать значение без проблем.

1 Ответ

0 голосов
/ 03 апреля 2020
class RootSimulator:

    def sim_text(self, text):
            return text

Определяет метод экземпляра для экземпляров RootSimulator. Вы пытаетесь позвонить sim_text из самого класса. Вам нужно создать экземпляр:

simulator = car_sim_functions.RootSimulator()
my_result = simulator.sim_text()

Если sim_text() на самом деле не нужно присоединять к экземпляру симулятора, возможно, вам вообще не нужен класс (просто сделайте его простым функция), или вы можете сделать это методом c:

class RootSimulator:

    @staticmethod
    def sim_text(text):
            return text

Обратите внимание, что ему больше не нужен self.

...