Как вы можете распаковать аргументы метода, чтобы назначить им атрибуты класса? - PullRequest
0 голосов
/ 20 сентября 2018

Я много делаю такого рода вещи:

class Box:
    def __init__(self):
        some_setup_stuff()
    def configure(
        self,
        color               = "#ffffff",
        weight              = 1,
        empathy             = 97,
        angle_x             = 0,
        angle_y             = 0,
        angle_z             = 0,
        displacement_x      = 0,
        displacement_y      = 0,
        displacement_z      = 0
        ):
        self.color          = color
        self.weight         = weight
        self.empathy        = empathy
        self.angle_x        = angle_x
        self.angle_y        = angle_y
        self.angle_z        = angle_z
        self.displacement_x = displacement_x
        self.displacement_y = displacement_y
        self.displacement_z = displacement_z
    def open(self):
        reveal_head()

Есть ли какой-нибудь аккуратный, небольшой и достаточно разумный способ "распаковать" аргументы, переданные методу класса, в атрибуты класса (при сохранениизначения по умолчанию указаны явно)?Например, я думаю, что locals() можно было бы как-то использовать вокруг первой строки метода, но для меня это не очевидно.

Таким образом, мы могли бы получить что-то вроде этого:

class Box:
    def __init__(self):
        some_setup_stuff()
    def configure(
        self,
        color               = "#ffffff",
        weight              = 1,
        empathy             = 97,
        angle_x             = 0,
        angle_y             = 0,
        angle_z             = 0,
        displacement_x      = 0,
        displacement_y      = 0,
        displacement_z      = 0
        ):
        # magic possibly involving locals()
    def open(self):
        reveal_head()

И это можно использовать так:

>>> box = Box()
>>> box.configure(empathy = 98)
>>> box.weight
1
>>> box.empathy
98

1 Ответ

0 голосов
/ 20 сентября 2018

Вот немного хакерский метод.Создайте словарь defaults, содержащий значения по умолчанию для ваших разрешенных параметров.Затем обновите self.__dict__ с помощью **kwargs после некоторой проверки ошибок на ключах:

class Box:
    def __init(self):
        pass
    def configure(self, **kwargs):
        defaults = {
            "color": "#ffffff",
            "weight": 1,
            "empathy": 97,
            "angle_x": 0,
            "angle_y": 0,
            "angle_z": 0,
            "displacement_x": 0,
            "displacement_y": 0,
            "displacement_z": 0
        }
        bad_args = [k for k in kwargs if k not in defaults]
        if bad_args:
            raise TypeError("configure() got unexpected keyword arguments %s"%bad_args)
        self.__dict__.update(defaults)
        self.__dict__.update(kwargs)

Теперь вы можете сделать:

box = Box()
box.configure(empathy = 98)
print(box.weight)
#1
print(box.empathy)
#98

Но если вы сделали:

box.configure(wieght = 2)
#TypeError: configure() got unexpected keyword arguments ['wieght']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...