czytałem jakiś kod, który wyglądał w zasadzie tak:Czy "__module__" jest gwarantowane podczas tworzenia klasy?
class Foo(object):
class_name = __module__.replace('_', '-')
do mnie, że wyglądała naprawdę dziwne (__module__
, co to jest?), Więc poszedłem i spojrzał na pytona data-model. Szybkie wyszukiwanie pokazuje, że __module__
jest właściwością obiektów klasy i obiektów funkcji. Jednak w globalnej przestrzeni nazw nie ma dostępnego __module__
(można go łatwo sprawdzić, po prostu próbując na nie spojrzeć i obserwując, że wynik jest ...).
Postanowiłem przypisać to do konkretnego zachowania, ale jako ostatnią próbę zdecydowałem się przetestować z innymi wdrożeniami, które mam pod ręką. Okazuje się, że tego kodu z
- CPython 2.7.6
- CPython 3.4.0
- jython 2.5.3
- pypy 2,2,1 (Python 2.7.3)
Moje pytanie brzmi, czy to zachowanie jest faktycznie zdefiniowane w dowolnym miejscu w odnośniku do języka. Nie jestem pewien, dlaczego chciałbym, ale czy mogę bezpiecznie polegać na __module__
będąc w przestrzeni nazw tworzenia klas lub czy wszyscy implementatorzy po prostu decydują się zrobić to w ten sam sposób?
Wszystko linux, ale wątpię, że sprawy ...
Nie można znaleźć niczego oprócz stanów [Python 2.3 * Co nowego *] (https://docs.python.org/2/whatsnew/2.3.html#build-and-c-api-changes) * Jeśli dynamicznie przydzielasz obiekty typu do swojego rozszerzenia, powinieneś wiedzieć o zmianie zasad dotyczących atrybutów "__module__" i "__name__". Podsumowując, będziesz chciał upewnić się, że słownik typu zawiera klucz "__module __"; tworząc nazwę modułu część nazwy typu prowadzącej do ostatniego okresu nie będzie już miała pożądanego efektu. Aby uzyskać więcej informacji, przeczytaj dokumentację referencyjną interfejsu API lub źródło. * –
Ponieważ wydaje się, że wszyscy już to popierają, może być uzasadnione żądanie standaryzacji. – Veedrac
@Veedrac - Nie zgadzam się tutaj. W języku Pythona jest dość dziwnie, że nazwiska pojawiają się tylko w twoim (nieglobalnym) obszarze nazw. na przykład Nie oczekuję, że pojawią się magiczne imiona, gdy stworzę funkcję ... – mgilson