Python словарь пуст при импорте в другой модуль - PullRequest
0 голосов
/ 02 мая 2020

Это шаблон проекта, поэтому я не могу многое изменить ...

Я опущу то, что я считаю несущественными частями:

#file server.py
import functions
import json
import socket

funcs = {}


class JSONRPCServer:
    """The JSON-RPC server."""

    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.sock = None

    def register(self, name, function):
        """Registers a function."""
        funcs[name] = function
(...)

if __name__ == "__main__":
    # Test the JSONRPCServer class
    server = JSONRPCServer('0.0.0.0', 8000)

    # Register functions
    server.register('hello', functions.hello)
    server.register('greet', functions.greet)
    server.register('add', functions.add)
    server.register('sub', functions.sub)
    server.register('mul', functions.mul)
    server.register('div', functions.div)

    print(funcs)

    # Start the server
    server.start()

Здесь будут напечатаны все мои функции внутри funcs dict.

У меня есть другой файл, который нуждается в содержимом функций, но для тестирования у меня есть это:

#file test.py

from server import funcs

print(funcs)

Это печатает пустой словарь. Как мне сделать так, чтобы funcs сохранял свои значения в этих двух файлах?

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Когда вы запускаете файл test.py, все, что находится внутри

if __name__ == "__main__"

server.py, не запускается, поскольку это не основной файл (когда вы запускаете server.py непосредственно, это входит в if __main__ и поэтому заполняет диктат funcs). Следовательно, все эти server.register вызовы не выполняются при запуске файла test.py, и, следовательно, ваш funcs dict пуст.

Может быть, поместить этот фрагмент кода со всеми вызовами регистра в другая функция, и вызовите это напрямую?

1 голос
/ 02 мая 2020
  1. Когда вы напрямую запускаете server.py, он печатает заполненное веселье c, а __name__=="__main__" оценивается как true. Это не работает, когда server.py импортируется в другой модуль.
  2. Кроме того, в качестве хорошей практики вы должны добавить функцию в server.py для получения funcs вместо того, чтобы полагаться на global.
  3. Кроме того, вы можете реорганизовать логи c внутри name == main для функции (например, start_server), чтобы любой модуль мог запустить сервер, просто вызывая эту функцию.
...