os.path.abspath
ничего не проверяет, поэтому, если мы уже добавляем строки к __file__
, нет необходимости беспокоиться о dirname
, присоединении или чем-либо еще. Просто относитесь к __file__
как к каталогу и начинайте лазить:
# climb to __file__'s parent's parent:
os.path.abspath(__file__ + "/../../")
Это гораздо менее запутанно, чем os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
и примерно так же легко управляется, как dirname(dirname(__file__))
. Восхождение более чем на два уровня начинает становиться смешным.
Но, поскольку мы знаем, сколько уровней нужно пройти, мы могли бы очистить это с помощью простой маленькой функции:
uppath = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n])
# __file__ = "/aParent/templates/blog1/page.html"
>>> uppath(__file__, 1)
'/aParent/templates/blog1'
>>> uppath(__file__, 2)
'/aParent/templates'
>>> uppath(__file__, 3)
'/aParent'