Вы можете найти решение в SQL User Defined Function для разбора разделительной строки полезно (из Проект кода ).
Это часть кода с этой страницы:
CREATE FUNCTION [fn_ParseText2Table]
(@p_SourceText VARCHAR(MAX)
,@p_Delimeter VARCHAR(100)=',' --default to comma delimited.
)
RETURNS @retTable
TABLE([Position] INT IDENTITY(1,1)
,[Int_Value] INT
,[Num_Value] NUMERIC(18,3)
,[Txt_Value] VARCHAR(MAX)
,[Date_value] DATETIME
)
AS
/*
********************************************************************************
Purpose: Parse values from a delimited string
& return the result as an indexed table
Copyright 1996, 1997, 2000, 2003 Clayton Groom (Clayton_Groom@hotmail.com)
Posted to the public domain Aug, 2004
2003-06-17 Rewritten as SQL 2000 function.
Reworked to allow for delimiters > 1 character in length
and to convert Text values to numbers
2016-04-05 Added logic for date values based on "new" ISDATE() function, Updated to use XML approach, which is more efficient.
********************************************************************************
*/
BEGIN
DECLARE @w_xml xml;
SET @w_xml = N'' + replace(@p_SourceText, @p_Delimeter,'') + ' ';
INSERT INTO @retTable
([Int_Value]
, [Num_Value]
, [Txt_Value]
, [Date_value]
)
SELECT CASE
WHEN ISNUMERIC([i].value('.', 'VARCHAR(MAX)')) = 1
THEN CAST(CAST([i].value('.', 'VARCHAR(MAX)') AS NUMERIC) AS INT)
END AS [Int_Value]
, CASE
WHEN ISNUMERIC([i].value('.', 'VARCHAR(MAX)')) = 1
THEN CAST([i].value('.', 'VARCHAR(MAX)') AS NUMERIC(18, 3))
END AS [Num_Value]
, [i].value('.', 'VARCHAR(MAX)') AS [txt_Value]
, CASE
WHEN ISDATE([i].value('.', 'VARCHAR(MAX)')) = 1
THEN CAST([i].value('.', 'VARCHAR(MAX)') AS DATETIME)
END AS [Num_Value]
FROM @w_xml.nodes('//root/i') AS [Items]([i]);
RETURN;
END;
GO
Давайте начнем с: вы, вероятно, на самом деле не хотите этого. API pathlib
в Python3 выглядит лучше, чем этот, и уже широко поддерживается.
root = pathlib.Path('root')
file1 = root / 'details' / 'file1' # a Path object at that address
if file1.is_file():
file1.unlink()
else:
try:
file1.rmdir()
except OSError as e:
# directory isn't empty
Но если вы по какой-то причине не уверены в этом, вам нужно переопределить __getattr__
, чтобы создать новый объект FileStructure
и отслеживать родителей и детей.
class FileStructure(object):
def __init__(self, name, parent):
self.__name = name
self.__children = []
self.__parent = parent
@property
def parent(self):
return self.__parent
@property
def children(self):
return self.__children
@property
def name(self):
return self.__name
def __getattr__(self, attr):
# retrieve the existing child if it exists
fs = next((fs for fs in self.__children if fs.name == attr), None)
if fs is not None:
return fs
# otherwise create a new one, append it to children, and return it.
new_name = attr
new_parent = self
fs = self.__class__(new_name, new_parent)
self.__children.append(fs)
return fs
Затем используйте его с:
root = FileStructure("root", None)
file1 = root.details.file1
Вы можете добавить __str__
и __repr__
, чтобы помочь вашим представлениям. Вы даже можете включить свойство path
# inside FileStructure
@property
def path(self):
names = [self.name]
cur = self
while cur.parent is not None:
cur = cur.parent
names.append(cur.name)
return '/' + '/'.join(names[::-1])
def __str__(self):
return self.path
Предварительно: это плохое решение, но оно отвечает вашим требованиям с минимальными изменениями. По сути, вам нужно, чтобы экземпляры __str__
работали, поэтому это обманывает, используя синтаксис декоратора, чтобы изменить объявление класса в одноэлементную реализацию объявленного класса. Поскольку невозможно неявно ссылаться на внешние классы из вложенных классов , ссылка выполняется явно. А для повторного использования __str__
, file1
и file2
были превращены в @property
с тем, чтобы они могли использовать форму str
экземпляра details
для построения себя.
@object.__new__
class FileStructure(object): # Root directory
root = "root"
@object.__new__
class details(object): # details directory
root = "details"
@property
def file1(self):
return os.path.join(str(self), 'file1')
@property
def file2(self):
return os.path.join(str(self), 'file2')
def __str__(self):
return f"{os.path.join(FileStructure.root, self.root)}"
def __str__(self):
return f"{self.root}"
Опять же: хотя это и приводит к желаемому поведению, это все же является плохим решением. Я сильно подозреваю, что у вас здесь есть проблема XY , но это отвечает на вопрос в том виде, в котором он был задан.