Cách sử dụng dấu gạch nối trong Python

Nó bao gồm một số tập lệnh dòng lệnh - được xác định trong phần thiết lập. py [tôi biết, lỗi thời] như vậy

scripts = ['adios_db_init = adios_db.scripts.db_initialize:init_db_cmd',
          ...
           'adios_db_process_json = adios_db.scripts.process_json:run_through',
           ]
# and then, in the setup call:
...
entry_points={'console_scripts': scripts}

Điều này đã hoạt động tốt trong suốt một vài năm cập nhật Python và setuptools

Nhưng bỗng nhiên hôm nay [ Trăn 3. 9. 12, công cụ thiết lập 63. 2. 0], tôi nhận được khi cố chạy tập lệnh

$ adios_db_process_json ./
Traceback [most recent call last]:
  File "/Users/chris.barker/miniconda3/envs/adios_db/bin/adios_db_process_json", line 33, in 
    sys.exit[load_entry_point['adios-db', 'console_scripts', 'adios_db_process_json'][]]
  File "/Users/chris.barker/miniconda3/envs/adios_db/bin/adios_db_process_json", line 22, in importlib_load_entry_point
    for entry_point in distribution[dist_name].entry_points
  File "/Users/chris.barker/miniconda3/envs/adios_db/lib/python3.9/importlib/metadata.py", line 542, in distribution
    return Distribution.from_name[distribution_name]
  File "/Users/chris.barker/miniconda3/envs/adios_db/lib/python3.9/importlib/metadata.py", line 196, in from_name
    raise PackageNotFoundError[name]
importlib.metadata.PackageNotFoundError: adios-db

WTF?

Tôi biết rằng trong nhiều năm, hệ sinh thái đã muốn sử dụng dấu gạch ngang, thay vì dấu gạch dưới, cho một số loại đặt tên gói [phân phối] được chuẩn hóa. Tôi KHÔNG BAO GIỜ hiểu điều đó - bạn không thể có dấu gạch nối trong tên gói có thể nhập - tại sao bạn lại muốn có một dấu gạch nối trong tên trong PyPi?

Dù sao đi nữa, tôi có thể thấy việc thay thế dấu gạch ngang bằng dấu gạch dưới một cách tự động, nhưng tại sao nó lại diễn ra theo cách khác?

VÌ THẾ

  1. Tôi làm cách nào để khắc phục sự cố này?
    [Tôi thú nhận là tôi đã tìm hiểu khá nhiều trên Google nhưng chưa xem các tài liệu hiện tại và chưa cập nhật các phương pháp hay nhất mới nhất – nhưng tôi

  2. Tại sao điều này lại xảy ra?

Cuối cùng. Bước tiếp theo của tôi là cài đặt lại mọi thứ từ đầu và xem liệu đây có phải là một kết quả kỳ lạ nào đó vô tình được đưa vào bởi một số bản cập nhật ngoài hệ thống hay không – nhưng nó thực sự, thực sự kỳ lạ

Các phiên bản gạch nối và gạch dưới của tên đề cập đến cùng một gói, vì chúng có cùng tên được chuẩn hóa

Đây là mối quan tâm của tôi - tên có dấu gạch nối không phải là dấu hiệu nhận dạng trăn hợp pháp. Vì vậy, nó không thể là tên "gói" - ít nhất là trong định nghĩa của "gói python" - nó có thể [và rõ ràng là chính thức] là tên "phân phối" - trong đó "phân phối" là thứ mà người ta cài đặt [thường là từ PyPi

Sự khác biệt này đặc biệt rõ ràng với “mọi thứ” [không chắc nên sử dụng từ nào] với các tên phân biệt rõ ràng cho bản phân phối và gói python – e. g

pip install beautifulsoup4

sau đó

import bs4

và trên thực tế, vì một bản phân phối có thể cài đặt nhiều hơn một gói python, đây là một điểm khác biệt khá quan trọng

Tất cả điều này là phần giới thiệu về ý tưởng rằng trong khi tôi vẫn còn bối rối về lý do tại sao bất kỳ tên chuẩn hóa nào cũng sẽ bao gồm dấu gạch dưới - điều cực kỳ quan trọng là tên gói python không bao gồm chúng - vậy tại sao trình bao bọc tập lệnh [hoặc đặc tả] lại sử dụng chúng ??

Một lần nữa, đây có thể là lỗi do thứ gì đó không đồng bộ trong cài đặt của tôi – và tôi sẽ điều tra vấn đề đó ngay bây giờ – nhưng nếu không – đây là vấn đề cần đưa ra khi phát triển công cụ thiết lập, đúng không?

Mô-đun dictools chứa một danh sách không đầy đủ các chuỗi ngôn ngữ có sẵn có thể được sử dụng để khởi tạo các đối tượng Dấu gạch nối như minh họa ở trên

>>> from hyphen import dictools
>>> dictools.LANGUAGES
['af_ZA', 'an_ES', 'ar', 'be_BY', 'bg_BG', 'bn_BD', 'br_FR', 'ca', 'cs_C
Z', 'da_DK', 'de', 'el_GR', 'en', 'es_ES', 'et_EE', 'fr_FR', 'gd_GB', 'gl', 'gu_
IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'it_IT', 'ku_TR', 'lt_LT', 'lv_LV', 'ne
_NP', 'nl_NL', 'no', 'oc_FR', 'pl_PL', 'prj', 'pt_BR', 'pt_PT', 'ro', 'ru_RU', '
si_LK', 'sk_SK', 'sl_SI', 'sr', 'sv_SE', 'sw_TZ', 'te_IN', 'th_TH', 'uk_UA', 'zu
_ZA']

Các tệp từ điển đã tải xuống được lưu trữ trong một thư mục dữ liệu cục bộ, cùng với một từ điển. json liệt kê các tệp đã tải xuống và các ngôn ngữ được liên kết

$ ls ~/.local/share/pyhyphen
dictionaries.json  hyph_de_DE.dic  hyph_en_US.dic

$ cat ~/.local/share/pyhyphen/dictionaries.json
{
  "de": {
    "file": "hyph_de_DE.dic",
    "url": "//cgit.freedesktop.org/libreoffice/dictionaries/plain/de/hyph_de_DE.dic"
  },
  "de_DE": {
    "file": "hyph_de_DE.dic",
    "url": "//cgit.freedesktop.org/libreoffice/dictionaries/plain/de/hyph_de_DE.dic"
  },
  "en_PH": {
    "file": "hyph_en_US.dic",
    "url": "//cgit.freedesktop.org/libreoffice/dictionaries/plain/en/hyph_en_US.dic"
  },
  "en_US": {
    "file": "hyph_en_US.dic",
    "url": "//cgit.freedesktop.org/libreoffice/dictionaries/plain/en/hyph_en_US.dic"
  }
}

Mỗi mục từ điển. json chứa cả đường dẫn đến tệp từ điển và url mà nó được tải xuống từ đó

Bạn có thể sử dụng dấu gạch nối trong Python không?

Các gói và mô-đun Python không thể sử dụng dấu gạch ngang , chỉ có dấu gạch dưới. Phần này của PEP-8 cung cấp cho chúng tôi hướng dẫn. Tên gói và mô-đun. Các mô-đun nên có tên ngắn, toàn chữ thường. Dấu gạch dưới có thể được sử dụng trong tên mô-đun nếu nó cải thiện khả năng đọc.

Bạn có thể sử dụng dấu gạch nối trong tên biến Python không?

Tên biến không hợp lệ trong Python . Nếu chúng tôi làm bất kỳ điều nào trong số này, mã của chúng tôi sẽ tạo ra lỗi. We cannot use a dash [-] to separate words in a variable name. If we do any of these, our code will generate an error.

Dấu gạch nối có thể được sử dụng trong các biến không?

Bạn có thể sử dụng dấu gạch nối trong tên biến máy chủ . SQL diễn giải dấu gạch nối được bao quanh bởi khoảng trắng dưới dạng toán tử trừ.

Chủ Đề