Как вызвать json.load внутри метода класса при импорте модуля json сверху - PullRequest
0 голосов
/ 10 ноября 2019

Я не могу понять, почему json.load возвращает мне «TypeError: load () принимает 1 позиционный аргумент, но 2 были заданы» при вызове метода загрузки, если я импортирую метод загрузки из json в начале. Вместо этого импортируйте его в метод и вызывайте функции game_data = load (file). Почему? Как я могу сделать это, импортируя нагрузку сверху, как и все другие методы?

class start:
    from module_x import method_y
    from json import load

    def __init__(self,game,data = {}):
        self.name = game + '.json'
        self.data = data

def xyz():
        self.method_y() #calling other methods with self.method is okay

def loading(self , file = None): 
        if not file:
            file = self.name
        with open(file, 'r') as file:
            game_data = self.load(file) #here is not okay
        return game_data

вместо этого все в порядке:

 def loading(self , file = None): 
        from json import load
        if not file:
            file = self.name
        with open(file, 'r') as file:
            game_data = load(file) 
        return game_data

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Проблема в том, что функция «load» модуля «json» принимает только один аргумент, но поскольку теперь это метод созданного вами класса, он всегда получит «self» в качестве первого и переданного аргумента. как второй. Поэтому невозможно напрямую импортировать функцию в класс. Вам нужно импортировать сам модуль или импортировать функцию внутри функции загрузки или последний параметр, чтобы импортировать его только в начало файла, только тогда вы сможете вызывать и использовать его по назначению.

Опция 1:

class myClass:
    import json
    def myLoadindFunction(self, fileObject):
        fileContent = self.json.load(fileObject)

Вариант 2:

class myClass:
    def myLoadindFunction(self, fileObject):
        from json import load
        fileContent = load(fileObject)

Вариант 3:

from json import load
class myClass:
    def myLoadindFunction(self, fileObject):
        fileContent = load(fileObject)
0 голосов
/ 10 ноября 2019

Если вы применяете правильные отступы, проблема заключается в том, что ваш экземпляр передается вызываемому методу. Когда вы пишете self.method(), Python будет вызывать method(self).

. Вы можете импортировать модуль json вместо метода, тогда у вас будет self.module.method().

class start:
    import json

    def __init__(self,game,data = {}):
        self.name = game + '.json'
        self.data = data

    def loading(self , file = None): 
            if not file:
                file = self.name
            with open(file, 'r') as file:
                game_data = self.json.load(file)
            return game_data

. примечание: вы не должны помещать импорт куда-либо, кроме начала файла. Начиная с PEP8 , руководство по стилю Python:

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

...