Manipilating with data values does not seem like a good practice:
self.path_info = {"scheme": "hdfs", "user": self.user}
It can be replaced by classes:
class BasePathInfo(object):
def __init__(self, path=None):
....
class HdfsPathInfo(BasePathInfo):
def __init__(self, path=None):
....
etc...