A számítástechnikában a névtér olyan jelek (nevek) halmaza, amelyeket különböző típusú objektumok azonosítására és hivatkozására használnak. Ez biztosítja, hogy egy adott objektumkészlet minden eleme egyedi nevet kapjon, így könnyen azonosítható.

A névterek általában hierarchikus szerkezetben vannak kialakítva, hogy lehetővé tegyék a nevek újrafelhasználását különböző szövegösszefüggésekben. Analógiaként gondolhatunk például az emberek elnevezési rendszerére, ahol minden személynek van egy keresztneve és egy családneve, ami közös a rokonaival. Ha a családtagok keresztnevei csak a családon belül egyediek, akkor minden személyt egyértelműen azonosíthatunk a keresztneve és a családneve kombinációjával; csak egy Jane Doe van, bár lehet több Jane is. A Doe család névtérében a „Jane" elegendő a személy egyértelmű jelöléséhez, míg az „összes ember" globális névtéren belül a teljes név használata szükséges.

A névterekre jó példák a fájlrendszerek, amelyek neveket rendelnek a fájlokhoz.[1] Egyes programozási nyelvek névterekbe rendezik változóikat és „szubrutinjaikat”.[2][3] A számítógépes hálózatok és az elosztott rendszerek neveket rendelnek az erőforrásokhoz, például számítógépekhez, nyomtatókhoz, webhelyekhez és távoli fájlokhoz. Az operációs rendszerek feloszthatják a kernel erőforrásait elszigetelt névterekkel a virtualizációs tárolók támogatása érdekében.

Hasonlóan, a hierarchikus fájlrendszerek könyvtárakba szervezik a fájlokat. Minden könyvtár külön névtér, tehát a „levelek” és a „számlák” könyvtárban is lehet egy „to_jane” nevű fájl.

A programozásban a névtereket általában arra használják, hogy a szimbólumokat és azonosítókat egy adott funkcionalitás köré csoportosítsák, és elkerüljék a névütközéseket olyan azonosítók között, amelyek ugyanazt a nevet viselik.

A hálózati kommunikációban a Domain Name System hierarchikus névterekbe szervezi a webhelyeket (és más erőforrásokat).

Névütközések

szerkesztés

Az elemek nevét a fejlesztő határozza meg. Ez gyakran ütközést eredményez a különböző XML-alkalmazásokból származó XML-dokumentumokkal való keverésekor.

Ez az XML HTML-tábla információkat tartalmaz:

<table>
    <tr>
        <td>Apples</td>
        <td>Oranges</td>
    </tr>
</table>

Ez az XML információkat tartalmaz egy „table”-ről, asztalról (azaz egy bútorról):

<table>
    <name>Mahogany Coffee Table</name>
    <width>80</width>
    <length>120</length>
</table>

Ha ezeket az XML-töredékeket összeadnák, névütközés lépne fel. Mindkettő tartalmaz egy <table>...</table> elemet, de az elemek eltérő tartalommal és jelentéssel bírnak.

Az XML-elemző nem tudja, hogyan kezelje ezeket a különbségeket.

Megoldás előtaggal

szerkesztés

Az XML-ben előforduló névütközések könnyen elkerülhetők névelőtag használatával.

A következő XML megkülönbözteti a HTML-táblázat „table”-jét és a bútorokkal kapcsolatos „table”-t úgy, hogy az elemek elején „h" és „f" előtagot ír elő.

<h:table>
    <h:tr>
        <h:td>Apples</h:td>
        <h:td>Oranges</h:td>
    </h:tr>
</h:table>

<f:table>
    <f:name>Mahogany Coffee Table</f:name>
    <f:width>80</f:width>
    <f:length>120</f:length>
</f:table>

Elnevezési rendszer

szerkesztés

A névtérben lévő név névtérnévből és helyi névből áll.[4][5] A névtér nevét általában a helyi név előtagjaként alkalmazzák.

Kibővített Backus–Naur-formában:

név = <névtér neve> elválasztó <helyi név>

Ha a helyi neveket önmagukban használjuk, a névfeloldást használják annak eldöntésére, hogy egy adott helyi név melyik névre utal (ha van ilyen).

Példák nevekre egy névtérben
Kontextus Név Névtér neve Helyi név
Elérési út /home/user/readme.txt /home/user (könyvtár) readme.txt (fájl név)
Tartománynév www.example.com example.com (tartománynév) www (levéltartománynév)
C++ std::array std (C++ névtér) array (struktúra)
UN/LOCODE US NYC US (ország vagy terület) NYC (helység)
XML xmlns:xhtml="http://www.w3.org/1999/xhtml"

<xhtml:body>
xhtml (korábban deklarált XML névtér xhtml="http://www.w3.org/1999/xhtml") body (elem)
Perl $DBI::errstr $DBI (Perl modul) errstr (változó)
Java java.util.Date java.util (Java névtér) Date (osztály)
Egységes erőforrásnév (URN) urn:nbn:fi-fe19991055 urn:nbn (National Bibliography Numbers) fi-fe19991055
Handle System 10.1000/182 10 (névadó jogosultság kezelése) 1000/182 (helyi név kezelése)
Digitális objektumazonosító 10.1000/182 10.1000 (kiadó) 182 (kiadvány)
MAC-cím 01-23-45-67-89-ab 01-23-45 (szervezetileg egyedi azonosító) 67-89-ab (NIC specifikus)
PCI ID 1234 abcd 1234 (vendor ID) abcd (eszközazonosító)
USB VID/PID 2341 003f[6] 2341 (vendor ID) 003f (termékazonosító)
SPARQL dbr:Sydney dbr (korábban deklarált ontológia, pl. @prefix dbr megadásával: <http://dbpedia.org/resource/>) Sydney

Delegáció

szerkesztés

A felelősségek delegálása fontos az alkalmazásokban, mint például a World Wide Web szerkezetében. A névterek lehetővé teszik az azonosítók kiosztásának delegálását több neveket kibocsátó szervezetnek, miközben globális egyediséget biztosítanak.[7] Egy központi regisztrációs hatóság regisztrálja a kiosztott névtérneveket. Minden névtérnév egy szervezethez van kiosztva, amely később felelős a nevek kiosztásáért a hozzájuk rendelt névtérben. Ez a szervezet lehet egy neveket kibocsátó szervezet, amely maga rendeli hozzá a neveket, vagy egy másik regisztrációs hatóság, amely további részeket delegál névterükből különböző szervezeteknek.

Hierarchia

szerkesztés

A hierarchikus névtér, olyan névképzési séma, amely lehetővé teszi a névtér részeknek történő aldelegálását harmadik feleknek.

Egy hierarchia rekurzív, ha a névtérnevek szintaxisa ugyanaz minden aldelegálás esetén. Egy példa a rekurzív hierarchiára a Domain névrendszer.

Egy nem rekurzív hierarchia példája az Internet Assigned Numbers Authority (IANA) számot reprezentáló Uniform Resource Name (URN).

Hierarchikus névtér felbontás példája az urn:isbn:978-3-16-148410-0 esetében, ami az „A tudományos felfedezés logikája" című Karl Popper könyv azonosítója, a 10. kiadásra vonatkozik."
Iktató hivatal Regisztráló Példa azonosító Névtér neve Névtér
Egységes erőforrásnév (URN) Internet Assigned Numbers Authority urn:isbn:978-3-16-148410-0 urna Formális URN névtér
Formális URN névtér Internet Assigned Numbers Authority urn:isbn:978-3-16-148410-0 ISBN [rfc:3187 Nemzetközi szabványos könyvszámok, mint egységes forrásnevek]
Nemzetközi cikkszám (EAN) GS1 978-3-16-148410-0 978 Bookland
Nemzetközi szabványos könyvszám (ISBN) International ISBN Agency 3-16-148410-X 3 német nyelvű országok
Német kiadói kód Agentur für Buchmarktstandards 16 Mohr Siebeck

Névterek és hatáskör (scope) közötti különbség

szerkesztés

A névtér neve kontextust biztosíthat (a számítástechnikában hatókört)a névhez, és a kifejezéseket néha felcserélhetően használják. A név kontextusát azonban más tényezők is megadhatják, például az előfordulási hely vagy a név szintaxisa.

Példák elnevezési rendszerekre helyi és globális hatókörrel, névterekkel és névterekkel
Névtér nélkül Névtérrel
Helyi hatókör Gépjármű rendszámtábla Fájlrendszer-hierarchia szabvány
Globális hatókör Univerzálisan egyedi azonosító Domain Name System

Programozási nyelvekben

szerkesztés

Sok programozási nyelv esetén a névtér a neveik kontextusa. Egy operációs rendszerben a névtér példája lehet egy könyvtár. Egy könyvtárban minden név egyértelműen azonosít egy fájlt vagy alkönyvtárat.[8]

Általános szabály, hogy a névterekben a neveknek nem lehet több jelentése; azaz különböző jelentések nem oszthatják meg ugyanazt a nevet ugyanabban a névtérben. A névtér emiatt kontextusnak is nevezhető, mert ugyanaz a név különböző névterekben más-más jelentéssel bír, amely megfelel az adott névtérnek.

A névtérnek további jellemzői a következők:

  • A névtérben lévő nevek objektumokat és fogalmakat is képviselhetnek, legyen a névtér természetes vagy etnikai nyelv, konstruált nyelv, dialektus, szociolektus vagy mesterséges nyelv (pl. programozási nyelv).
  • A Java programozási nyelvben a névterekben megjelenő azonosítóknak van egy rövid (helyi) neve és egy egyedi hosszú „minősített" név a névtéren kívüli használatra.
  • Egyes fordítók (például a C++ nyelvekhez)a névtereket és a neveket a fordító belső használatára egyesítik a name mangling nevű folyamatban .

A fent leírt absztrakt nyelvi technikai használaton túlmenően egyes nyelvek tartalmaznak egy speciális kulcsszót, amelyet többek között az explicit névtér szabályozására használnak.  Az alábbiakban egy példa látható a C++ névterére:

#include <iostream>

// This is how one brings a name into the current scope.  In this case, it's
// bringing them into global scope.
using std::cout;
using std::endl;

namespace box1 {
    int box_side = 4;
}

namespace box2 {
    int box_side = 12;
}

int main() {
    int box_side = 42;
    cout << box1::box_side << endl;  // Outputs 4.
    cout << box2::box_side << endl;  // Outputs 12.
    cout << box_side << endl;  // Outputs 42.
}

Számítástechnikai szempontok

szerkesztés

A számítástechnikában a névtér (néha névtartománynak is nevezik) egy absztrakt tároló vagy környezet, amelyet egyedi azonosítók vagy szimbólumok (azaz nevek) logikai csoportosítására hoztak létre. Egy névtérben definiált azonosító csak ahhoz a névtérhez tartozik. Ugyanaz az azonosító egymástól függetlenül definiálható több névtérben. Tehát egy azonosító, amely egy névtérben van definiálva, jelenti ugyanazt is vagy jelenti mást is, mint ugyanaz az azonosító egy másik névtérben. A névtereket támogató nyelvek leírják azokat a szabályokat, amelyek meghatározzák, hogy egy azonosító melyik névtérhez tartozik.[9]

Ezt a fogalmat egy analógiával lehet szemléltetni. Képzeljük el, hogy két vállalat, X és Y, mindegyiküknek van dolgozóihoz hozzárendelve azonosítószám. Az X vállalatnak nem lehet két dolgozója ugyanazzal az azonosítószámmal, és ugyanez igaz a Y vállalatra is. Azonban nem probléma, ha ugyanaz az azonosítószám mindkét vállalatnál használatban van. Például, ha Bill az X vállalatnál dolgozik, és Jane az Y vállalatnál, akkor nem probléma, hogy mindketten a 123-as dolgozói azonosítót kapják. Ebben az analógiában az azonosító a dolgozói azonosítószám és a vállalat szolgál a névtérként. Nem okoz problémát, hogy ugyanaz az azonosító különböző személyeket azonosítson meg a különböző névterekben.

Nagy programokban vagy dokumentumokban gyakran száznál is több azonosító található. A névterek lehetővé teszik a helyi azonosítók elrejtését. Biztosítják a logikailag kapcsolódó azonosítók megfelelő névterekbe történő csoportosítását, ezáltal modulárisabbá téve a rendszert.

Adattároló eszközök és sok modern programozási nyelv támogatja a névtereket. Az adattároló eszközök könyvtárakat (vagy mappákat) használnak névterekként. Ez lehetővé teszi, hogy két azonos nevű fájl legyen tárolva az eszközön, feltéve, hogy különböző könyvtárakban vannak tárolva. Néhány programozási nyelvben (például C++, Python) a névtereket elnevező azonosítók maguk is kapcsolatban állnak egy beágyazó névtérrel. Így ezekben a nyelvekben a névterek egymásba ágyazódhatnak, létrehozva egy névtérfa struktúrát. Ennek a fának a gyökerénél található a globális névtér.

Használata a nyelvekben

szerkesztés

A C99 óta lehetőség van névtelen struktúrák névtérként való használatára C- ben.

// helper.c
static int _add(int a, int b) {
    return a + b;
}

const struct {
    double pi;
    int (*add) (int, int);
} helper = { 3.14, _add };

// helper.h
const struct {
    double pi;
    int (*add) (int, int);
} helper;

// main.c
#include <stdio.h>
#include „helper.h"

int main(){
    printf("3 + 2 = %d\n", helper.add(3, 2));
    printf("pi is %f\n", helper.pi);
}

A C++ nyelvben egy névteret egy névtérblokk határoz meg.[10]

namespace abc {
    int bar;
}

Ezen a blokkon belül az azonosítók pontosan úgy használhatók, ahogyan deklarálva vannak. Ezen a blokkon kívül a névtér-meghatározót előtaggal kell ellátni. A C++ tartalmaz egy másik konstrukciót is, amely szükségtelenné teszi ezt a bőbeszédűséget. Az alábbi hozzáadásával:

using namespace abc;

az abc:: előtagra már nincs szükség.

A névtérben kifejezetten nem deklarált azonosítók a globális névtérben találhatók.

int foo;

Ezek az azonosítók pontosan úgy használhatók, ahogyan deklarálva vannak, vagy mivel a globális névtér névtelen, a névtér-meghatározó :: előtagként is megadható. Például foo írható is ::foo.

A C++ névtérfelbontása hierarchikus. Ez azt jelenti, hogy a hipotetikus névtéren belül food::soup az azonosító chicken a következőre utal food::soup::chicken. Ha food::soup::chicken nem létezik, akkor arra hivatkozik food::chicken. Ha sem food::soup::chicken és food::chicken sem létezik, akkor chicken a globális névtérben található ::chicken azonosítóra hivatkozik.

A C++ névtereit leggyakrabban az elnevezési ütközések elkerülésére használják. Bár a névtereket széles körben használják a legújabb C++ kódokban, a legtöbb régebbi kód nem használja ezt a lehetőséget, mert nem létezett a nyelv korai verzióiban. Például a teljes C++ Standard Library belül van definiálva namespace std, de a szabványosítás előtt sok összetevő eredetileg a globális névtérben volt. A programozó beillesztheti a usingdirektívát, hogy megkerülje a névtérfeloldási követelményeket, és visszafelé kompatibilis legyen a régebbi kóddal, amely elvárja, hogy minden azonosító a globális névtérben legyen. Az irányelvnek a visszafelé kompatibilitáson kívüli okokból (pl. kényelem) való felhasználása azonban using ellentétes a helyes kódexszel.

A Java nyelvben a névtér gondolata Java csomagokban testesül meg. Minden kód egy csomaghoz tartozik. A más csomagokból származó kódok a csomag nevének a megfelelő azonosító előtti előtaggal érhetők el. A C++-hoz hasonlóan a Java is kínál egy konstrukciót, amely szükségtelenné teszi a csomagnév beírását. Bizonyos funkciók (például a tükrözés)azonban megkövetelik a programozótól, hogy a teljesen minősített nevet használja.

A C++-tól eltérően a Java névterei nem hierarchikusak, a nyelv szintaxisát miatt. A csomagok elnevezése azonban hierarchikus módon történik. Például minden olyan csomaggal kezdődően, amely a Java platformjava részét képezi – a csomag tartalmazza a nyelv alapvető osztályait, és kifejezetten a tükrözéshez kapcsolódó alapvető osztályokat.

A Java (és Ada , C# és mások) nyelvben a névterek/csomagok a kód szemantikai kategóriáit fejezik ki. Például C#-ban namespace System a rendszer által biztosított kódot tartalmazza (a .NET-keretrendszer). Az, hogy mennyire specifikusak ezek a kategóriák, és milyen mélyre mennek a hierarchiák, nyelvenként eltérő.

A függvény- és osztálytartományok implicit névtereknek tekinthetők, amelyek elválaszthatatlanul kapcsolódnak a láthatósághoz, a hozzáférhetőséghez és az objektum élettartamához.

A névtereket gyakran használják a C# nyelvben. Minden .NET-keretrendszer-osztály névterekbe van rendezve, hogy egyértelműbben használhatók legyenek, és elkerülhető legyen a káosz. Ezenkívül a programozók széles körben alkalmazzák az egyéni névtereket munkájuk szervezésére és az elnevezési ütközések elkerülésére. Amikor egy osztályra hivatkozunk, meg kell adni vagy annak teljes nevét, ami a névterét jelenti, amelyet az osztályneve követ.

System.Console.WriteLine("Hello World!");
int i = System.Convert.ToInt32("123");

vagy adjunk hozzá using kulcsszót. Ezzel szükségtelenné válik az adott névtérben található összes osztály teljes nevének használata.

using System;

Console.WriteLine("Hello World!");
int i = Convert.ToInt32("123");

A fenti példákban a System névtér, a Console és a Convert pedig a System-ben meghatározott osztályok.

 

A Pythonban a névtereket az egyes modulok határozzák meg, és mivel a modulok hierarchikus csomagokba foglalhatók, a névterek is hierarchikusak.[11][12] Általánosságban elmondható, hogy modul importálásakor a modulban definiált nevek a modul névterén keresztül kerülnek meghatározásra, és a hívó modulokból a teljesen minősített név használatával érhetők el.

# assume modulea defines two functions : func1() and func2() and one class : Class1
import Modulea

Modulea.func1()
Modulea.func2()
a = Modulea.Class1()

A from ... import ... utasítással a megfelelő neveket közvetlenül a hívó modul névterébe lehet beilleszteni, és ezek a neveket a hívó modulból a minősített név nélkül elérhetők:

# assume Modulea defines two functions : func1() and func2() and one class : Class1
from Modulea import func1

func1()
func2() # this will fail as an undefined name, as will the full name Modulea.func2()
a = Class1() # this will fail as an undefined name, as will the full name Modulea.Class1()

Mivel ez közvetlenül importálja a neveket (minősítés nélkül), figyelmeztetés nélkül felülírhatja a meglévő neveket.

Az utasítás egy speciális formája, from ... import * amely a megnevezett csomagban meghatározott összes nevet közvetlenül a hívó modul névterébe importálja. Az importálás ezen formájának használata, bár a nyelven belül támogatott, általában nem ajánlott, mivel szennyezi a hívó modul névterét, és névütközések esetén a már meghatározott nevek felülírását okozza.

A Python import x as ya hívó modul által használható álnevet vagy alternatív nevet is támogatja:

import numpy as np

a = np.arange(1000)
XML névtér
szerkesztés

Az XML-ben az XML névtér-specifikáció lehetővé teszi, hogy az XML-dokumentumban szereplő elemek és attribútumok nevei egyediek legyenek, hasonlóan a programozási nyelvek névtereihez. XML-névterek használatával az XML-dokumentumok egynél több XML-szókincsből is tartalmazhatnak elem- vagy attribútumneveket.

A névtereket az 5.3-as verziótól kezdve vezették be a PHP- ba. Az osztályok, függvények és változók neveinek ütközése elkerülhető a segítségével. A PHP- ban egy névteret egy névtérblokk határoz meg.

# File phpstar/foobar.php

namespace phpstar;

class FooBar
{
    public function foo(): void
    {
        echo 'Hello world, from function foo';
    }

    public function bar(): void
    {
        echo 'Hello world, from function bar';
    }
}

A PHP névterekre a következő módokon hivatkozhatunk:

# File index.php

# Include the file
include „phpstar/foobar.php";

# Option 1: directly prefix the class name with the namespace
$obj_foobar = new \phpstar\FooBar();

# Option 2: import the namespace
use phpstar\FooBar;
$obj_foobar = new FooBar();

# Option 2a: import & alias the namespace
use phpstar\FooBar as FB;
$obj_foobar = new FB();

# Access the properties and methods with regular way
$obj_foobar->foo();
$obj_foobar->bar();

 

Névterek emulálása

szerkesztés

Azokban a programozási nyelvekben, amelyek nem támogatják a névtereket, a névterek bizonyos mértékig emulálhatók egy azonosító elnevezési konvenció használatával.[13] Például a C-könyvtárak, a libpng, gyakran fix előtagot használnak minden olyan függvényhez és változóhoz, amely a nyílt felület részét képezi. A Libpng olyan azonosítókat tesz közzé, mint például:

png_create_write_struct
png_get_signature
png_read_row
png_set_invalid

Ez az elnevezési konvenció biztosítékot nyújt arra vonatkozóan, hogy az azonosítók egyediek, és ezért nagyobb programokban is használhatók elnevezési ütközések nélkül. Hasonlóképpen, sok eredetileg Fortranban írt csomag (pl. BLAS , LAPACK)lefoglalja egy függvény nevének első néhány betűjét, hogy jelezze, melyik csoporthoz tartozik.

E technika hátrányai:

  • Nem skálázódik jól beágyazott névterekre; Az azonosítók túlságosan hosszúakká válnak, mivel az azonosítók minden használatának teljes mértékben névtér minősítésűnek kell lennie.
  • Az egyének vagy szervezetek következetlen elnevezési konvenciókat alkalmazhatnak, ami nemkívánatos elhomályosítást okozhat.
  • Az azonosítók csoportjain végzett összetett vagy „lekérdezés-alapú” műveletek, azon névterek alapján, amelyekben deklaráltak, nehézkesek vagy megvalósíthatatlanok.
  • A korlátozott azonosító hosszúságú nyelveken az előtagok használata korlátozza a függvény működésének azonosítására használható karakterek számát. Ez különösen az eredetileg FORTRAN 77-ben írt csomagoknál jelent problémát, amelyek azonosítónként csak 6 karaktert kínáltak. Például a BLAS függvény neve azt DGEMM jelzi, hogy kettős pontosságú számokkal („D”) és általános mátrixokkal („GE”) működik, és csak az utolsó két karakter mutatja, hogy valójában mit is csinál: mátrix-mátrix szorzás ("MM").

Előnyei:

  • Nincs szükség speciális szoftvereszközökre a nevek forráskód-fájlokban történő megtalálásához. Elég egy egyszerű program, mint a grep.
  • Nincsenek névütközések a névterekben.
  • Nincs szükség névrontásra, így nincs esetleges összeférhetetlenségi probléma sem.
  1. (2002) „FARSITE: Federated, Available, and Reliable Storage for an Incompletely Trusted Environment”. Proc. USENIX Symp. on Operating Systems Design and Implementation. [2010. július 28-i dátummal az eredetiből archiválva]. Hozzáférés: 2023. szeptember 21. „The primary construct established by a file system is a hierarchical directory namespace, which is the logical repository for files.” 
  2. C# FAQ: What is a namespace. C# Online Net. [2013. október 20-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. február 23.) „A namespace is nothing but a group of assemblies, classes, or types. A namespace acts as a container—like a disk folder—for classes organized into groups usually based on functionality. C# namespace syntax allows namespaces to be nested.”
  3. An overview of namespaces in PHP. PHP Manual . „What are namespaces? In the broadest definition, namespaces are a way of encapsulating items. This can be seen as an abstract concept in many places. For example, in any operating system directories serve to group related files, and act as a namespace for the files within them.”
  4. XML Core Working Group: Namespaces in XML 1.0 (Third Edition). W3C, 2009. december 8. (Hozzáférés: 2012. március 30.)
  5. Sablon:Cite IETF
  6. Stephen J. Gowdy: List of USB ID's, 2013
  7. Sablon:Cite IETF
  8. C# FAQ: What is a namespace. C# Online Net . [2013. október 20-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. február 23.) „For instance, [under Windows], to access the built-in input-output (I/O) classes and members, use the System.IO namespace. Or, to access Web-related classes and members, use the System.Web namespace.”
  9. A namespace is "a logical grouping of the names used within a program.". Webopedia.com, 2002. április 10. (Hozzáférés: 2011. július 26.)
  10. Namespaces allow to group entities like classes, objects and functions under a name.. Cplusplus.com. (Hozzáférés: 2011. július 26.)
  11. 6. Modules. The Python Tutorial. Python Software Foundation. (Hozzáférés: 2010. október 25.)
  12. Python Scopes and Namespaces. Docs.python.org. (Hozzáférés: 2011. július 26.)
  13. Danny Kalev: Why I Hate Namespaces. [2016. július 9-i dátummal az eredetiből archiválva].

Fordítás

szerkesztés

Ez a szócikk részben vagy egészben a Namespace című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Kapcsolódó szócikkek

szerkesztés
  NODES
INTERN 4