Как представить файловую структуру как объекты Python

Вы можете найти решение в 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

1
задан tyleax 17 January 2019 в 00:06
поделиться

2 ответа

Давайте начнем с: вы, вероятно, на самом деле не хотите этого. 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
0
ответ дан Adam Smith 17 January 2019 в 00:06
поделиться

Предварительно: это плохое решение, но оно отвечает вашим требованиям с минимальными изменениями. По сути, вам нужно, чтобы экземпляры __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 , но это отвечает на вопрос в том виде, в котором он был задан.

0
ответ дан ShadowRanger 17 January 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: