join здесь именно собирает путь из отдельных частей, expand делается иначе, и смысл у него иной. другое дело что части путь не должны иметь слэшей, поэтому это уже проблема разработчика, чтобы в функцию не попали необработанные строки от пользователей