Brython: вызов методов из отдельного файла Python

Я довольно плохо знаком с фреймворком Brython, поэтому мой вопрос будет основным. Извиняюсь за это.

Вот мой скрипт "log.py":

import math

class Logarithm:
    def__init__(self,x,y):
        self.x = x
        self.y = y

    def log(x,y):
        return math.log(x[,y])

И в HTML:

        <script src = "https://cdnjs.cloudflare.com/ajax/libs/brython/3.3.20/brython_stdlib.js"></script>

        <script src = "log.py" type = "text/python"></script>
        <script>
             //some javascript code
        </script>

Теперь в моем javascript я хочу вызвать функцию log() класса Logarithm. Может кто-нибудь сказать мне, как я могу это сделать?

Заранее спасибо:-)

1 ответ

Решение

Brython позволяет вам писать Python в браузере напрямую, но это означает, что вы должны знать, что вы делаете на стороне Python. Ваш фрагмент синтаксически неверный Python. Когда мы исправляем синтаксис, мы должны исправить его так, чтобы он имел некоторый смысл - (поэтому, если вы берете x и y во время создания класса в качестве операнда и основания логарифма, вам больше не понадобится при использовании журнала).

И затем, когда мы исправим это, вы должны исправить html-часть, чтобы он мог правильно использовать Brython. Тогда вы готовы идти с тем, что вы хотите. Всегда смотрите на вывод консоли Javascript (ctrl + F12) - Brython может генерировать полезную обратную трассировку после загрузки, сообщая об ошибках в коде Python.

И затем вы должны иметь в виду, что, хотя авторы Brython сделали почти прозрачным вызов функций Python из обычного Javascript с приведенными ниже положениями, он не работает таким прозрачным способом для классов и методов, который вы пытаетесь использовать,

TL;DR: для тех, у кого уже работает некоторый код Brython и кто хочет вызывать функции Brython из Javascript, просто выполните код Brython:

def my_func(...):
    ...

from browser import window
window.my_func = my_func

И теперь вы можете использовать "my_func" из простых блоков скриптов Javascrit, но вы должны позволить Brython некоторое время загружать и запускать его код - любой javascript, использующий Brython, должен вызываться некоторое время после того, как событие onload запускает основной brython функция. Смотрите пример ниже.

Итак, в вашем случае мы можем переписать файл log.py так:

import math

class Logarithm:
    def __init__(self, x, y=10):
        self.x = x
        self.y = y

    def log(self):
        return math.log(self.x,self.y)


from browser import window
window.Logarithm = Logarithm

И затем, мы должны правильно написать html-файл для загрузки основного Brython и stdlib Python как двух отдельных тегов сценария, активировать brython в событии onload, и тогда мы готовы к работе:

<html>
  <head>
    <script src="http://brython.info/src/brython.js"></script>
    <script type="text/javascript" src="http://brython.info/src/brython_stdlib.js"></script>
    <script src="log.py" type="text/python3"></script>
    <script type="text/javascript">
        function do_python() {
            var obj = window.Logarithm(100, 10);
            var result = obj.__class__.log(obj);
            document.write(result);
        }
    </script>
  </head>
  <body onload="brython(); setTimeout(do_python, 300)">

  </body>
</html>

Обратите внимание, что Javascript, фактически вызывающий класс Brython, заключен в вызов setTimeout. Это позволяет Brython настроить вещи. И хотя вы можете создать экземпляр объекта Brython, просто вызвав класс, для вызова методов вы должны вручную вызвать затем __class__ атрибут, и передать экземпляр явно в качестве первого параметра.

Механизм поиска имени метода в классе и добавления self Параметр автоматически используется только тогда, когда экземпляр используется из Brython.

Другие вопросы по тегам