[英]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.