繁体   English   中英

类参数的默认值等于另一个参数

[英]Class argument's default value equal to another argument

我有一个类,我希望将多个文件路径作为可选参数,但默认值中应该有另一个参数。 有没有更好的方法来代替检查 None 4 次? 如果您设置参数,它也会输出错误。 默认工作正常。

我基本上想要这样:你有这个类,你可以根据需要设置文件路径,但如果你不设置它,它的默认值为{name}_something

from typing import Optional

class Test():
    def __init__(
        self,
        name: str,
        num: Optional[str] = None,
        DIR_A: Optional[str] = None,
        DIR_B: Optional[str] = None,
        ANOTHER_DIR: Optional[str] = None,
        DIR_2: Optional[str] = None,
    ) -> None:
        if DIR_A is None:
            self.DIR_A = f"{name}_Test"

        if DIR_B is None:
            self.DIR_B = f"{name}_ThisisalsoaTest"

        if ANOTHER_DIR is None:
            self.ANOTHER_DIR = f"{name}_TestNr3"

        if DIR_2 is None:
            self.DIR_2 = f"{name}_Test4ig"

        

    def get_files(self):
        print(self.DIR_A)


test = Test(name="test", num="12345", DIR_A="test")
test.get_files()

您可以遍历FILES_*参数列表,测试并替换 None 并使用setattr将它们设置为具有任何值的属性。

然而,你可以决定这是否足够可读,因为可读性总是比聪明好。

from typing import Optional

class Test():
    def __init__(
        self,
        name: str,
        num: Optional[str] = None,
        FILES_1: Optional[str] = None,
        FILES_2: Optional[str] = None,
        FILES_3: Optional[str] = None,
        FILES_4: Optional[str] = None,
    ) -> None:
        for i, file in enumerate([FILES_1, FILES_2, FILES_3, FILES_4], 1):
            if file is None:
                file = f"{name}_File_{i}"
            setattr(self, f"FILES_{i}", file)

    def get_files(self):
        print(self.FILES_1)
        print(self.FILES_2)
        print(self.FILES_3)
        print(self.FILES_4)


test = Test(name="test", num="12345", FILES_1="myfile")
test.get_files()

或者在 OP 的编辑之后,并且增加了相当多的复杂性。

class Test:
    def __init__(
        self,
        name: str,
        num: Optional[str] = None,
        DIR_A: Optional[str] = None,
        DIR_B: Optional[str] = None,
        ANOTHER_DIR: Optional[str] = None,
        DIR_2: Optional[str] = None,
    ) -> None:
        defaults = [
            f"{name}_Test",
            f"{name}_ThisisalsoaTest",
            f"{name}_TestNr3",
            f"{name}_Test4ig",
        ]
        attrs = ["DIR_A", "DIR_B", "ANOTHER_DIR", "DIR_2"]
        args = [DIR_A, DIR_B, ANOTHER_DIR, DIR_2]
        for arg, at, default in zip(args, attrs, defaults):
            if arg is None:
                arg = default
            setattr(self, at, arg)

    def get_files(self):
        print(self.DIR_A)
        print(self.DIR_B)
        print(self.ANOTHER_DIR)
        print(self.DIR_2)

PS。 typing.Optional[X]等价于X | None X | None ,我发现它更具可读性并节省了导入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM