Modul Python dengan tanda hubung, atau tanda hubung (-) di namanya

92

Saya memiliki modul python dengan tanda hubung di namanya, foo-bar.py

Mengubah nama modul adalah sesuatu yang saya lebih suka hindari karena modul dibagikan, dan saya harus mengejar semua tempat yang digunakan sehingga kasus khusus saya akan berfungsi.

Apakah ada cara untuk memuat modul yang namanya berisi '-' yang biasanya dilarang?

(Saya mengerti bahwa ini bukan praktik terbaik. Tetapi untuk situasi ini, saya memilih untuk tidak mendesain ulang dan menguji kumpulan aplikasi yang jauh lebih besar. Selain itu, saya rasa para pakar perusahaan saya tidak akan menyetujui saya meluangkan waktu untuk menerapkan perubahan seperti itu.)

Lewati Huffman
sumber
5
Anda tidak bisa begitu saja melakukan find-in-files di IDE Anda dan mengganti semua foo-bars dengan foobaratau apa pun? Seberapa sulit itu?
agf
2
Jawaban ini khususnya: stackoverflow.com/questions/761519/…
BenH
agf Jawaban singkat: tidak semua kode saya.
Lewati Huffman
S.Lott pengguna lain adalah aplikasi komersial. Begitulah cara saya tahu itu mungkin.
Lewati Huffman

Jawaban:

98

Anda bisa melakukannya dengan menggunakan __import__(). Sebagai contoh:

foobar = __import__("foo-bar")

Tetapi Anda benar-benar harus mengganti nama modul sebagai gantinya. Dengan begitu, Anda dapat menghindari kebingungan di mana nama file modul berbeda dari pengenal yang digunakan dalam program.

nandhp
sumber
4
Terima kasih. Saya mengerti bahwa konvensi harus diikuti jika memungkinkan. Saya akan membahas masalah khusus ini selama tinjauan kode departemen.
Lewati Huffman
58

Saya tahu pertanyaan ini telah dijawab untuk kepuasan penanya, tetapi berikut adalah jawaban lain yang saya percaya memiliki beberapa manfaat di atas __import__().

import importlib
mod = importlib.import_module("path.to.my-module")
# mod.yourmethod()

Menurut dokumen:

"This provides an implementation of import which is portable to any 
Python interpreter. This also provides an implementation which is 
easier to comprehend than one implemented in a programming language 
other than Python."

Python 2.7 + saja

NuclearPeon
sumber
5
Saya sedang mencari bagaimana melakukan ini dan jawaban Anda berlaku lebih baik untuk situasi saya daripada jawaban yang lebih lama. Ada baiknya jika Anda melihat jawaban yang berbeda dari jawaban yang sudah ada untuk menambahkannya sebagai jawaban baru sehingga orang dengan posisi seperti saya dapat menemukan semua informasi yang relevan di satu tempat.
Davy M
1

Coba gunakan garis bawah, bukan tanda hubung.

impor pymysql_utils

bekerja untuk saya meskipun import pymysql-utils adalah nama modul yang digunakan oleh pip

thetrueankev
sumber