Přehled programovacího modelu pro uživatele uživatele Fabric

Model programování uživatelských datových funkcí Fabric definuje vzory a koncepty pro tvorbu funkcí ve Fabric.

Sada fabric-user-data-functions SDK implementuje tento programovací model, který poskytuje nezbytné funkce pro vytváření a publikování spustitelných funkcí. Sada SDK také umožňuje bezproblémovou integraci s dalšími prvky v ekosystému Fabric, jako jsou zdroje dat Fabric. Uživatelská knihovna je veřejně dostupná v PyPI a je předinstalovaná v položkách datových funkcí uživatelů.

Tento článek vysvětluje, jak pomocí sady SDK sestavovat funkce, které je možné vyvolat z portálu Fabric, dalších položek infrastruktury nebo externích aplikací pomocí rozhraní REST API. S praktickými příklady se seznámíte s programovacím modelem a klíčovými koncepty.

Návod

Úplné podrobnosti o všech třídách, metodách a parametrech najdete v referenční dokumentaci k sadě SDK.

Začínáme s prostředím SDK

Tato sekce představuje základní komponenty SDK pro uživatelská data a vysvětluje, jak strukturovat vaše funkce. Dozvíte se o požadovaných importech, dekorátorech a typech vstupních a výstupních dat, která vaše funkce dokážou zpracovat.

Sada SDK pro funkce uživatelských dat

Sada fabric-user-data-functions SDK poskytuje základní komponenty, které potřebujete k vytvoření funkcí uživatelských dat v Pythonu.

Požadované importy a inicializace

Každý soubor uživatelských datových funkcí musí importovat fabric.functions modul a inicializovat kontext spuštění:

import datetime
import fabric.functions as fn
import logging

udf = fn.UserDataFunctions()

Dekorátor @udf.function()

Funkce označené dekorátorem @udf.function() se dají vyvolat z portálu Fabric, z jiné položky Fabric nebo z externí aplikace. Funkce s tímto dekorátorem musí určovat návratový typ.

Příklad:

@udf.function()
def hello_fabric(name: str) -> str:
    logging.info('Python UDF trigger function processed a request.')
    logging.info('Executing hello fabric function.')
    
    return f"Welcome to Fabric Functions, {name}, at {datetime.datetime.now()}!"

Pomocné funkce

Metody Pythonu bez dekorátoru @udf.function() nelze vyvolat přímo. Mohou být volány pouze ze dekorovaných funkcí a slouží jako pomocných funkcí.

Příklad:

def uppercase_name(name: str) -> str:
    return name.upper()

Podporované vstupní typy

Můžete definovat vstupní parametry pro funkci, jako jsou primitivní datové typy, jako je str, int, float atd. Podporované vstupní datové typy jsou:

Typ JSON Datový typ Python
Řetězec Str
řetězec data a času datetime
Booleova logika Booleova hodnota
Čísla int (celé číslo), float (desetinné číslo)
Pole seznam[], příklad seznam[celočíselný]
Objekt slovník
Objekt pandas DataFrame
Objekt nebo pole objektů Pandas Series

Poznámka:

Pokud chcete použít datový rámec pandas a typy řad, přejděte na portál Fabric, vyhledejte pracovní prostor a otevřete položku funkcí uživatelských dat. Vyberte správu knihovny, vyhledejte fabric-user-data-functions balíček a aktualizujte ho na verzi 1.0.0 nebo novější.

Příklad textu požadavku pro podporované typy vstupu:

{
  "name": "Alice",                          // String (str)
  "signup_date": "2025-11-08T13:44:40Z",    // Datetime string (datetime)
  "is_active": true,                        // Boolean (bool)
  "age": 30,                                // Number (int)
  "height": 5.6,                            // Number (float)
  "favorite_numbers": [3, 7, 42],           // Array (list[int])
  "profile": {                              // Object (dict)
    "email": "alice@example.com",
    "location": "Sammamish"
  },
  "sales_data": {                           // Object (pandas DataFrame)
    "2025-11-01": {"product": "A", "units": 10},
    "2025-11-02": {"product": "B", "units": 15}
  },
  "weekly_scores": [                        // Object or Array of Objects (pandas Series)
    {"week": 1, "score": 88},
    {"week": 2, "score": 92},
    {"week": 3, "score": 85}
  ]
}

Podporované typy výstupu

Podporované výstupní datové typy jsou:

Datový typ Python
Str
datetime
Booleova hodnota
int (celé číslo), float (desetinné číslo)
list[datový typ], například list[int]
slovník
Žádný
Pandas Series
pandas DataFrame

Psaní funkcí

Požadavky na syntaxi a omezení

Při psaní funkcí uživatelských dat dodržujte specifická syntaktická pravidla, abyste zajistili, že vaše funkce fungují správně.

Pojmenování parametrů

  • Použití camelCase: Názvy parametrů musí používat konvenci pojmenování camelCase a nesmí obsahovat podtržítka. Například použijte productName místo product_name.
  • Vyhrazená klíčová slova: Nemůžete použít vyhrazená klíčová slova Pythonu nebo následující klíčová slova specifická pro Fabric jako názvy parametrů nebo názvy funkcí: req, context a reqInvocationId.

Požadavky na parametry

  • Povinné poznámky typu: Všechny parametry musí obsahovat poznámky typu (například name: str).

  • Výchozí hodnoty: Podporují se výchozí hodnoty parametrů. V uživatelských datových funkcích Fabric můžete definovat výchozí argumenty, abyste usnadnili volání a údržbu kódu. Parametry s výchozími hodnotami jsou volitelné při vyvolání; parametry bez výchozích hodnot jsou povinné. Jako výchozí hodnoty se podporují následující typy:

    Výchozí typ Notes
    String Libovolný řetězec json serializovatelný.
    Řetězec datetime Zadejte jako řetězec v podpisu funkce. Modul runtime analyzuje řetězec při datetime vyvolání. Pro konzistentní, jednoznačnou analýzu použijte formát ISO 8601 (například 2025-12-31T23:59:59Z).
    logický True nebo False.
    Integer Libovolná celočíselná hodnota.
    Float Libovolná hodnota s plovoucí čárkou.
    Seznam Musí být serializovatelný ve formátu JSON. Upřednostněte None v podpisu a přiřaďte skutečné výchozí hodnoty uvnitř funkce, abyste se vyhnuli sdíleným proměnlivým výchozím hodnotám.
    Slovník Musí být serializovatelný ve formátu JSON. Preferujte None v podpisu funkce a přiřaďte skutečnou výchozí hodnotu uvnitř funkce.
    pandas DataFrame Poskytuje se jako objekt JSON, který sada SDK převede na typ pandas. Vyžaduje fabric-user-data-functions verzi 1.0.0 nebo novější.
    Pandas Series Poskytuje se jako pole JSON objektů, které sada SDK převede na typ pandas. Vyžaduje fabric-user-data-functions verzi 1.0.0 nebo novější.

    Syntax

    @udf.function()
    def function_name(
        requiredParam: str,
        optionalStr: str = "hello",
        optionalDate: datetime.datetime = "2025-01-01T00:00:00Z",  # specify as a string; the runtime parses it to datetime at invocation time
        optionalBool: bool = True,
        optionalInt: int = 10,
        optionalFloat: float = 1.5,
        optionalList: list | None = None,   # assign real default inside the function
        optionalDict: dict | None = None,   # assign real default inside the function
    ) -> dict:
        optionalList = optionalList or [1, 2, 3]
        optionalDict = optionalDict or {"key": "value"}
        return {"param": requiredParam}
    

    Výchozí hodnoty musí být serializovatelné ve formátu JSON (sady a tuply se nepodporují). Pro výchozí hodnoty seznamu nebo slovníku použijte None v podpisu a přiřaďte skutečné výchozí nastavení uvnitř funkce, abyste se vyhnuli sdíleným proměnlivým výchozím nastavením. Pro výchozí hodnoty data a času použijte formát ISO 8601 (například 2025-12-31T23:59:59Z). Použití datového rámce pandas nebo řady jako výchozí verze vyžaduje fabric-user-data-functions verzi 1.0.0 nebo novější.

Požadavky na funkce

  • Povinný návratový typ: Funkce s dekorátorem @udf.function() musí určovat návratovou poznámku typu (například -> str).
  • Požadované importy: Příkaz import fabric.functions as fn a udf = fn.UserDataFunctions() inicializace jsou vyžadovány pro fungování vašich funkcí.

Příklad správné syntaxe

@udf.function()
def process_order(orderNumber: int, customerName: str, orderDate: str) -> dict:
    return {
        "order_id": orderNumber,
        "customer": customerName,
        "date": orderDate,
        "status": "processed"
    }

Jak napsat asynchronní funkci

Přidejte asynchronní dekorátor s definicí funkce v kódu. async Díky funkci můžete zlepšit rychlost odezvy a efektivitu aplikace tím, že budete zpracovávat více úloh najednou. Jsou ideální pro správu velkých objemů vstupně-výstupních operací. Tato ukázková funkce načte soubor CSV z datového jezera pomocí knihovny pandas. Funkce přebírá název souboru jako vstupní parametr.

import pandas as pd 

# Replace the alias "<My Lakehouse alias>" with your connection alias.
@udf.connection(argName="myLakehouse", alias="<My Lakehouse alias>")
@udf.function()
async def read_csv_from_lakehouse(myLakehouse: fn.FabricLakehouseClient, csvFileName: str) -> str:

    # Connect to the Lakehouse
    connection = myLakehouse.connectToFilesAsync()   

    # Download the CSV file from the Lakehouse
    csvFile = connection.get_file_client(csvFileName)

    downloadFile = await csvFile.download_file()
    csvData = await downloadFile.readall()
    
    # Read the CSV data into a pandas DataFrame
    from io import StringIO
    df = pd.read_csv(StringIO(csvData.decode('utf-8')))

    # Display the DataFrame    
    result="" 
    for index, row in df.iterrows():
        result=result + "["+ (",".join([str(item) for item in row]))+"]"
    
    # Close the connection
    csvFile.close()
    connection.close()

    return f"CSV file read successfully.{result}"

Práce s daty

Datová připojení ke zdrojům dat Fabric

Sada SDK umožňuje odkazovat na datová připojení bez nutnosti psaní připojovacích řetězců v kódu. Knihovna fabric.functions nabízí dva způsoby správy datových připojení:

  • fabric.functions.FabricSqlConnection: Umožňuje pracovat s databázemi SQL v Fabric, včetně koncových bodů SQL Analytics a Fabric skladů.
  • cs-CZ: fabric.functions.FabricLakehouseClient: Umožňuje pracovat s Lakehouses a zároveň poskytuje možnost připojení k tabulkám Lakehouse i souborům Lakehouse.

Pokud chcete odkazovat na připojení ke zdroji dat, musíte použít dekorátor @udf.connection. Můžete ho použít v některém z následujících formátů:

  • @udf.connection(alias="<alias for data connection>", argName="sqlDB")
  • @udf.connection("<alias for data connection>", "<argName>")
  • @udf.connection("<alias for data connection>")

Argumenty k @udf.connection jsou:

  • argName, název proměnné, která připojení používá ve vaší funkci.
  • alias, alias připojení, které jste přidali pomocí nabídky Spravovat připojení.
  • Pokud argName a alias mají stejnou hodnotu, můžete použít @udf.connection("<alias and argName for the data connection>").

Příklad

# Where demosqldatabase is the argument name and the alias for my data connection used for this function
@udf.connection("demosqldatabase")
@udf.function()
def read_from_sql_db(demosqldatabase: fn.FabricSqlConnection)-> list:
  # Connect to the SQL database
  connection = demosqldatabase.connect()
  cursor = connection.cursor()
  
  # Replace with the query you want to run
  query = "SELECT * FROM (VALUES ('John Smith', 31), ('Kayla Jones', 33)) AS Employee(EmpName, DepID);"
  
  # Execute the query
  cursor.execute(query)
  
  # Fetch all results
  results = cursor.fetchall()
  
  # Close the cursor and connection
  cursor.close()
  connection.close()
  
  return results

Obecná připojení pro komponenty Fabric nebo prostředky služby Azure

SDK podporuje obecná spojení, která můžete použít k vytváření spojení s Fabric položkami nebo Azure zdroji pomocí uživatelské datové funkce a identity vlastníka položek. Tato funkce vygeneruje token Microsoft Entra ID s identitou vlastníka položky a zadaným typem cílové skupiny. Použijte tento token k autentizaci pomocí Fabric položek nebo Azure zdrojů, které podporují daný typ publika. Tento přístup poskytuje podobné programovací prostředí, jako je použití objektů spravovaných připojení z funkce Spravovat připojení , ale pouze pro zadaný typ cílové skupiny v připojení.

Tato funkce používá @udf.generic_connection() dekorátor s následujícími parametry:

Parameter Popis Hodnota
argName Název proměnné, která je předána funkci. Uživatel musí tuto proměnnou zadat v argumentech své funkce a použít pro ni typ.fn.FabricItem Pokud argName=CosmosDbby například funkce měla tento argument obsahovat. cosmosDb: fn.FabricItem
audienceType Typ cílové skupiny, pro kterou je připojení vytvořeno. Tento parametr je přidružený k typu položky Infrastruktury nebo Azure službě a určuje klienta, který se pro připojení používá. Povolené hodnoty pro tento parametr jsou CosmosDb nebo KeyVault.

Připojte se k Cosmos DB v Fabric kontejneru pomocí generického připojení

Obecná spojení podporují nativní databáze Cosmos DB ve Fabric pomocí CosmosDB typu audience. Přiložena SDK pro uživatelská data poskytuje pomocnou metodu nazvanou get_cosmos_client , která pro každé volání načítá jednoho klienta Cosmos DB.

K databázi Cosmos DB se můžete připojit ve Fabric pomocí obecného připojení podle těchto kroků:

  1. Přejděte na portál Fabric, vyhledejte pracovní prostor a otevřete položku funkcí uživatelských dat. Vyberte Správa, vyhledejte knihovnu azure-cosmos a nainstalujte ji. Další informace najdete v tématu Správa knihoven.

  2. Jdi do své Cosmos databáze v nastavení předmětů Fabric.

    Screenshot ukazuje umístění tlačítka v Cosmos DB v nastavení Fabric.

  3. Získejte svou Cosmos DB v Fabric endpoint URL.

    Screenshot ukazující Cosmos DB v Fabric endpoint URL.

  4. Přejděte na položku funkcí uživatelských dat. Použijte následující ukázkový kód k připojení k vaší Cosmos DB v Fabric kontejneru a spusť dotaz na čtení pomocí ukázkové datové sady Cosmos DB. Nahraďte hodnoty následujících proměnných:

    • COSMOS_DB_URIs vaší Cosmos databází v Fabric endpointu.
    • DB_NAME s názvem položky vaší databáze Cosmos DB.
    from fabric.functions.cosmosdb import get_cosmos_client
    import json
    
    @udf.generic_connection(argName="cosmosDb", audienceType="CosmosDB")
    @udf.function()
    def get_product_by_category(cosmosDb: fn.FabricItem, category: str) -> list:
    
        COSMOS_DB_URI = "YOUR_COSMOS_DB_URL"
        DB_NAME = "YOUR_COSMOS_DB_NAME" # Note: This is the Fabric item name
        CONTAINER_NAME = "SampleData" # Note: This is your container name. In this example, we are using the SampleData container.
    
        cosmosClient = get_cosmos_client(cosmosDb, COSMOS_DB_URI)
    
        # Get the database and container
        database = cosmosClient.get_database_client(DB_NAME)
        container = database.get_container_client(CONTAINER_NAME)
    
        query = 'select * from c WHERE c.category=@category' #"select * from c where c.category=@category"
        parameters = [
            {
                "name": "@category", "value": category
            }
        ]
        results = container.query_items(query=query, parameters=parameters)
        items = [item for item in results]
    
        logging.info(f"Found {len(items)} products in {category}")
    
        return json.dumps(items)
    
  5. Otestujte nebo spusťte tuto funkci zadáním názvu kategorie, například Accessory v parametrech vyvolání.

Poznámka:

Pomocí těchto kroků se také můžete připojit k databázi Azure Cosmos DB pomocí adresy URL účtu a názvů databází. Účet vlastníka funkcí uživatelských dat potřebuje přístupová oprávnění k tomuto účtu Azure Cosmos DB.

Připojení k Azure Key Vault pomocí obecného připojení

Obecná připojení podporují připojení k Azure Key Vault pomocí typu cílové skupiny KeyVault. Tento typ připojení vyžaduje, aby vlastník funkcí uživatelských dat Fabric měl oprávnění připojit se k Azure Key Vault. Pomocí tohoto připojení můžete načíst klíče, tajné kódy nebo certifikáty podle názvu.

Pomocí následujícího postupu se můžete připojit k Azure Key Vault a načíst tajný klíč klienta pro volání rozhraní API pomocí obecného připojení:

  1. Přejděte na portál Fabric, vyhledejte pracovní prostor a otevřete položku funkcí uživatelských dat. Vyberte Správa a pak vyhledejte a nainstalujte knihovny requests a azure-keyvault-secrets. Další informace najdete v tématu Správa knihoven.

  2. Přejděte na prostředek Azure Key Vault v Azure portal a načtěte Vault URI a název klíče, tajného klíče nebo certifikátu.

    Screenshot zobrazující adresu URL koncového bodu Azure Key Vault a hodnoty.

  3. Vraťte se k položce Fabric user data functions a použijte tento vzor. V tomto příkladu získáte tajemství z Azure Key Vault, abyste se mohli připojit k veřejnému API. Nahraďte hodnotu následujících proměnných:

    • Nahraďte KEY_VAULT_URL hodnotou Vault URI, kterou jste načetli v předchozím kroku.
    • KEY_VAULT_SECRET_NAME s názvem tvého tajemství.
    • API_URL proměnná s adresou URL rozhraní API, ke kterému se chcete připojit. Tato ukázka předpokládá, že se připojujete k veřejnému rozhraní API, které přijímá požadavky GET, a přijímá následující parametry api-key a request-body.
    from azure.keyvault.secrets import SecretClient
    from azure.identity import DefaultAzureCredential
    import requests
    
    @udf.generic_connection(argName="keyVaultClient", audienceType="KeyVault")
    @udf.function()
    def retrieveNews(keyVaultClient: fn.FabricItem, requestBody:str) -> str:
        KEY_VAULT_URL = 'YOUR_KEY_VAULT_URL'
        KEY_VAULT_SECRET_NAME= 'YOUR_SECRET'
        API_URL = 'YOUR_API_URL'
    
        credential = keyVaultClient.get_access_token()
    
        client = SecretClient(vault_url=KEY_VAULT_URL, credential=credential)
    
        api_key = client.get_secret(KEY_VAULT_SECRET_NAME).value
    
        api_url = API_URL
        params = {
            "api-key": api_key,
            "request-body": requestBody
        }
    
        response = requests.get(api_url, params=params)
    
        data = "" 
    
        if response.status_code == 200:
            data = response.json()
        else:
            print(f"Error {response.status_code}: {response.text}")
    
        return f"Response: {data}"
    
  4. Otestujte nebo spusťte tuto funkci tak, že do kódu poskytnete text požadavku.

Rozšířené funkce

Programovací model definuje pokročilé vzory, které poskytují větší kontrolu nad vašimi funkcemi. Sada SDK implementuje tyto vzory prostřednictvím tříd a metod, které umožňují:

  • Získejte přístup k metadatům vyvolání o tom, kdo a jak volal vaši funkci.
  • Zpracování vlastních chybových scénářů pomocí strukturovaných chybových odpovědí
  • Integrace s knihovnami proměnných Fabric pro centralizovanou správu konfigurace

Poznámka:

Uživatelské datové funkce mají limity služeb pro velikost požadavku, časový limit provedení a velikost odpovědi. Podrobnosti o těchto omezeních a jejich vynucení najdete v tématu Podrobnosti o službě a omezení.

Získání vlastností vyvolání pomocí UserDataFunctionContext

Sada SDK obsahuje UserDataFunctionContext objekt. Tento objekt obsahuje metadata volání funkce a lze ji použít k vytvoření konkrétní logiky aplikace pro různé mechanismy vyvolání (například vyvolání portálu a vyvolání rozhraní REST API).

Následující tabulka ukazuje vlastnosti objektu UserDataFunctionContext:

Název vlastnosti Datový typ Popis
identifikátor_vyvolání řetězec Jedinečný identifikátor GUID svázaný s vyvoláním položky funkcí uživatelských dat.
provádějící_uživatel objekt Metadata informací uživatele použitých k autorizaci vyvolání

Objekt executing_user obsahuje následující informace:

Název vlastnosti Datový typ Popis
Oid řetězec (GUID) ID objektu uživatele, což je neměnný identifikátor žadatele. Jedná se o ověřenou identitu uživatele nebo instančního objektu použitého k vyvolání této funkce napříč aplikacemi.
Id nájemníka řetězec (GUID) ID tenanta, ke kterému je uživatel přihlášený.
Preferované uživatelské jméno řetězec Upřednostňované uživatelské jméno uživatele, který akci vyvolává, jak je nastaveno samotným uživatelem. Tato hodnota je proměnlivá.

Pokud chcete získat přístup k parametru UserDataFunctionContext, musíte v horní části definice funkce použít následující dekorátor: @udf.context(argName="<parameter name>")

Příklad

@udf.context(argName="myContext")
@udf.function()
def getContext(myContext: fabric.functions.UserDataFunctionContext)-> str:
    logging.info('Python UDF trigger function processed a request.')
    return f"Hello oid = {myContext.executing_user['Oid']}, TenantId = {myContext.executing_user['TenantId']}, PreferredUsername = {myContext.executing_user['PreferredUsername']}, InvocationId = {myContext.invocation_id}"

Vyvolejte ošetřenou chybu s UserThrownError

Při vývoji funkce můžete vyvolat očekávanou chybovou odpověď pomocí UserThrownError třídy dostupné v sadě SDK. Jedním z použití této třídy je řízení případů, kdy vstupy poskytnuté uživatelem neprojdou obchodními ověřovacími pravidly.

Příklad

import datetime

@udf.function()
def raise_userthrownerror(age: int)-> str:
    if age < 18:
        raise fn.UserThrownError("You must be 18 years or older to use this service.", {"age": age})

    return f"Welcome to Fabric Functions at {datetime.datetime.now()}!"

Konstruktor UserThrownError třídy má dva parametry:

  • Message: Tento řetězec se vrátí jako chybová zpráva aplikace, která vyvolá tuto funkci.
  • Slovník vlastností se vrátí do aplikace, která tuto funkci vyvolá.

Získání proměnných z knihoven proměnných Fabric

Knihovna proměnných ve Fabric je centralizované úložiště pro správu proměnných, které můžete používat napříč různými položkami v rámci pracovního prostoru. Umožňuje vývojářům efektivně přizpůsobovat a sdílet konfigurace položek. Pokud ještě knihovnu proměnných nemáte, přečtěte si téma Vytvoření a správa knihoven proměnných.

Chcete-li ve svých funkcích použít knihovnu proměnných, přidáte k ní připojení z položky funkcí uživatelských dat. Knihovny proměnných se zobrazují v katalogu OneLake společně se zdroji dat, jako jsou databáze SQL a datová jezírka.

Pokud chcete ve svých funkcích používat knihovny proměnných, postupujte takto:

  1. V položce funkcí uživatelských dat přidejte připojení k knihovně proměnných. V katalogu OneLake vyhledejte a vyberte knihovnu proměnných a pak vyberte Připojit. Všimněte si Aliasu, který pro připojení generuje Fabric.
  2. Přidejte dekorátor připojení pro položku v knihovně proměnných. Můžete například @udf.connection(argName="varLib", alias="<My Variable Library Alias>") nahradit alias nově přidaného připojení pro položku knihovny proměnných.
  3. Do definice funkce zahrňte argument s typem fn.FabricVariablesClient. Tento klient poskytuje metody, které potřebujete pro práci s položkou knihovny proměnných.
  4. Pomocí metody získejte getVariables() všechny proměnné z knihovny proměnných.
  5. Ke čtení hodnot proměnných se používají buď ["variable-name"] nebo .get("variable-name").

Příklad

V tomto příkladu simulujete konfigurační scénář pro produkční a vývojové prostředí. Tato funkce nastavuje cestu úložiště v závislosti na zvoleném prostředí pomocí hodnoty získané z knihovny proměnných. Knihovna proměnných obsahuje proměnnou nazvanou ENV , kde uživatelé mohou nastavit hodnotu dev nebo prod.

@udf.connection(argName="varLib", alias="<My Variable Library Alias>")
@udf.function()
def get_storage_path(dataset: str, varLib: fn.FabricVariablesClient) -> str:
    """
    Description: Determine storage path for a dataset based on environment configuration from Variable Library.
    
    Args:
        dataset_name (str): Name of the dataset to store.
        varLib (fn.FabricVariablesClient): Fabric Variable Library connection.
    
    Returns:
        str: Full storage path for the dataset.
    """
    # Retrieve variables from Variable Library
    variables = varLib.getVariables()
    
    # Get environment and base paths
    env = variables.get("ENV")    
    dev_path = variables.get("DEV_FILE_PATH")
    prod_path = variables.get("PROD_FILE_PATH")
    
    # Apply environment-specific logic
    if env.lower() == "dev":
        return f"{dev_path}{dataset}/"
    elif env.lower() == "prod":
        return f"{prod_path}{dataset}/"
    else:
        return f"incorrect settings define for ENV variable"