2017-08-30 42 views
5

W Javie mogę powołać klasę lub metody bez importowania go poprzez odniesienie jej nazwę w pełni kwalifikowaną:Jak wywołać metodę Pythona przy użyciu w pełni kwalifikowanej nazwy?

public class Example { 
    void example() { 

     //Use BigDecimal without importing it 
     new java.math.BigDecimal(1); 
    } 
} 

Podobny składnia będzie oczywiście nie działać przy użyciu Pythona:

class Example: 
    def example(self): 

     # Fails 
     print(os.getcwd()) 

praktyka i PEP sugestie Dobry na bok:, czy mogę zrobić to samo w Pythonie?

+1

Nie, nie można wywołać klasy ani metody bez jej importowania. Dlaczego chcesz uniknąć importowania? Możesz zaimportować go lokalnie w swojej funkcji, która po prostu zmienia twoją java-liner na 2-liniową w pytonie. Czy to jedyna rzecz, której starasz się unikać? – mgilson

+0

Mam ochotę na jednolinijkowe, ponieważ gram z jakimś zastrzykiem kodu opartym na AST i chciałbym zmodyfikować oryginalny moduł tak mało, jak to tylko możliwe – noamt

Odpowiedz

2

Funkcja nie istnieje dopóki jej definicja nie zostanie uruchomiona, co oznacza, że ​​moduł jest uruchomiony, co oznacza, że ​​moduł jest importowany (chyba że jest to skrypt, który uruchomiłeś bezpośrednio).

Najbliższą rzeczą, o której mogę myśleć, jest print(__import__('os').getcwd()).

+0

Wygląda na to, że '__import() __' będzie idealnie działało w tym przypadku – noamt

+1

@noamt Właściwie nie powinieneś używać '__import__'. Jeśli chcesz coś takiego, użyj 'importlib.import_module'. –

+0

Czy '__import__' lub' importlib' obsługuje w pełni kwalifikowane ścieżki z nazwami klas? na przykład 'module.OuterClass.InnerClass.some_classmethod'? – mgilson

1

nie jestem pewien, że można zrobić dokładnie to samo, ale można importować tylko funkcję:

from foo.bar import baz as baz_fn 

baz_fn() 

gdzie foo.bar to w pełni kwalifikowana nazwa modułu, który zawiera funkcję i baz jest nazwa funkcji, którą chcesz zaimportować. Zaimportuje go jako nazwę baz_fn.

2

Nie. Jeśli chcesz użyć modułu w Pythonie, musisz jawnie zaimportować jego nazwę do zakresu. I, jak wspomina @AlexHall, klasa/funkcja/moduł nie istnieje do czasu importu. Nie ma sposobu, aby uzyskać do niego dostęp bez import -ing. Moim zdaniem powoduje to jednak lepszy i bardziej wyraźny kod. Zmusza to użytkownika do jawności podczas importowania nazw modułów.

Powiązane problemy