Конкатенация прямого слеша "/" для STATIC_ROOT и MEDIA_ROOT (Django)
Я обнаружил, что иногда передний слэш "/" используется для конкатенации "BASE_DIR" и "static" или "media" для "STATIC_ROOT" и "MEDIA_ROOT" в "settings. py" как показано ниже:
# "settings.py"
# Here
STATIC_ROOT = BASE_DIR / 'static'
# Here
MEDIA_ROOT = BASE_DIR / 'media'
Итак, можно конкатенировать BASE_DIR, который является 'PosixPath' типом и 'static', который является 'str' типом с передней косой чертой "/".
Но когда я попытался конкатенировать 'str' type и 'str' type с "/":
# "settings.py"
STATIC_ROOT = 'abc' / 'static'
Я получил эту ошибку ниже:
TypeError: неподдерживаемый тип(ы) операнда для /: 'str' и 'str'
Для 'int' type и 'str' type с "/":
STATIC_ROOT = 123 / 'static'
Я получил эту ошибку ниже:
TypeError: неподдерживаемый тип(ы) операнда для /: 'int' и 'str'
Тогда для 'MyClass' type и 'str' type с "/":
# "settings.py"
class MyClass:
pass
STATIC_ROOT = MyClass() / 'static'
Я получил эту ошибку ниже:
TypeError: неподдерживаемый тип(ы) операнда для /: 'MyClass' и 'str'
Итак, можно ли конкатенировать только 'PosixPath' тип и 'str' тип с передней косой чертой "/"? Нет ли других типов для конкатенации с передней косой чертой "/"?
Django==3.x используйте pathlib, которые позволяют использовать / для конкатенации путей.
Если вы хотите добиться такого же поведения в одном из ваших классов, вам придется реализовать метод __truediv__.
class Thing:
def __init__(self, name):
self.name = name
def __truediv__(self, other):
return Thing(self.name + other)
thing = Thing('Monty')
other_thing = thing / 'Python'
print(other_thing.name)
Это даст вам вывод MontyPython.
Если вы хотите иметь возможность конкатенировать не только экземпляр Thing и строку, но и два экземпляра Thing, вы должны проверить тип other.
class Thing:
def __init__(self, name):
self.name = name
def __truediv__(self, other):
if isinstance(other, Thing):
return Thing(self.name + other.name)
return Thing(self.name + other)
thing = Thing('Monty')
thing2 = Thing('Python')
other_thing = thing / thing2
print(other_thing.name)