มันเป็นการตกลงที่จะใช้เครื่องหมายขีดกลางในไฟล์ Python เมื่อพยายามนำเข้าหรือไม่?


149

โดยทั่วไปเมื่อฉันมีไฟล์หลามเช่น:

python-code.py

และใช้:

import (python-code)

ล่ามให้ฉันข้อผิดพลาดทางไวยากรณ์

ความคิดเห็นเกี่ยวกับวิธีการแก้ไขหรือไม่ เครื่องหมายขีดคั่นผิดกฎหมายในชื่อไฟล์หลามหรือไม่

คำตอบ:


167

คุณควรตรวจสอบPEP 8คู่มือสไตล์สำหรับรหัส Python:

ชื่อแพ็กเกจและโมดูลโมดูลควรมีชื่อแบบย่อและตัวพิมพ์เล็กทั้งหมด สามารถใช้เครื่องหมายขีดล่างในชื่อโมดูลได้หากมีการปรับปรุงความสามารถในการอ่าน แพ็คเกจ Python ควรมีชื่อสั้นและตัวพิมพ์เล็กทั้งหมดแม้ว่าการใช้เครื่องหมายขีดล่างจะไม่ได้รับการสนับสนุน

เนื่องจากชื่อโมดูลถูกแม็พกับชื่อไฟล์และระบบไฟล์บางระบบเป็นแบบไม่คำนึงถึงขนาดตัวพิมพ์และตัดทอนชื่อยาวมันเป็นสิ่งสำคัญที่ชื่อโมดูลถูกเลือกให้สั้นพอสมควร - นี่ไม่ใช่ปัญหาสำหรับ Unix แต่อาจเป็น ปัญหาเมื่อรหัสถูกส่งไปยัง Mac หรือ Windows เวอร์ชั่นที่เก่ากว่าหรือ DOS

กล่าวอีกนัยหนึ่ง: เปลี่ยนชื่อไฟล์ของคุณ :)


75
ปัญหาที่เกิดขึ้นมีอะไรจะทำอย่างไรกับสไตล์มันเป็นไวยากรณ์ ผิดพลาด

4
ดังที่แสดงด้านล่างมีความเป็นไปได้ที่จะยังมีไฟล์ที่มีชื่อนี้อยู่ดังนั้นคำแนะนำรูปแบบจึงมีความเกี่ยวข้องมาก
เปาโลเบอร์กันติโน

5
มันจะมีประโยชน์มากในการใช้เครื่องหมายขีดคั่นในไดเรกทอรี Python และชื่อไฟล์เมื่อคุณต้องการป้องกันการนำเข้าอย่างชัดเจน ตัวอย่างเช่นใน (พูด) โครงการ Django คุณอาจมีสคริปต์ที่เขียนใน Python ที่ไม่ควรระบุว่าเป็นแอปพลิเคชัน คุณสามารถใส่สิ่งเหล่านี้ลงในโฟลเดอร์ที่ชอบops-scriptsและรู้ว่าพวกเขาไม่สามารถนำเข้าโดยใช้วิธีการปกติของแพ็คเกจเนมสเปซ หรืออาจตั้งชื่อสคริปต์เดียวstop-website.pyเพื่อให้มีผลกระทบที่คล้ายกัน สิ่งเหล่านี้ยังคงสามารถนำเข้าผ่านrunpyและวิธีการอื่น ๆ ได้ แต่จะช่วยหลีกเลี่ยงข้อผิดพลาดทั่วไปได้
Chris Johnson

การเปลี่ยนชื่อโมดูลอาจเป็นปัญหาได้โดยเฉพาะถ้าคุณใช้มาตรฐานอื่น ในกรณีของฉันฉันใช้ไฟล์หลาม cgi ในcgi-binโฟลเดอร์ (ทำ unitttests กับพวกเขา) ซึ่งเป็นไฟล์มาตรฐานที่ค่อนข้างดี ยกเว้นว่าคุณมีกรณีที่หายากเช่นนี้ให้เปลี่ยนชื่อโมดูลของคุณถ้าคุณสามารถควบคุมมันได้
NuclearPeon

1
ฉันเพิ่งค้นพบว่า PyDev จะอนุญาตชื่อไดเรกทอรีที่มียัติภังค์ แต่จะไม่แสดงคลาสและ / หรือตัวแปรภายในในไฟล์. py ที่อยู่ในไดเรกทอรีนั้น
user5920660

123

สิ่งอื่นที่ควรทราบในรหัสของคุณคือการนำเข้าไม่ใช่ฟังก์ชัน ดังนั้นimport(python-code)ควรimport python-codeเป็นอย่างที่บางคนได้กล่าวถึงแล้วถูกตีความว่าเป็น "นำเข้าหลามลบรหัส" ไม่ใช่สิ่งที่คุณตั้งใจ หากคุณต้องการนำเข้าไฟล์ด้วยเส้นประในชื่อจริง ๆ คุณสามารถทำสิ่งต่อไปนี้ ::

python_code = __import__('python-code')

แต่ตามที่กล่าวไว้ข้างต้นนี้ไม่แนะนำจริงๆ คุณควรเปลี่ยนชื่อไฟล์ถ้ามันเป็นสิ่งที่คุณควบคุม


@KevinAudleman คุณมีตัวอย่างการใช้งานของการนำเข้า lib กับไฟล์ที่มียัติภังค์หรือไม่? ฉันพยายามแล้วล้มเหลว
Tom Hale

@TomHale importlib.import_module ('abmodule-1') ควรใช้งานได้ หาก import_module ของคุณใช้งานไม่ได้ฉันคิดว่าการนำเข้าปกติก็ใช้ไม่ได้เช่นกัน
Ian Lin

64

TLDR

เครื่องหมายขีดคั่นไม่ผิดกฎหมาย แต่คุณไม่ควรใช้ด้วยเหตุผล 3 ประการ:

  1. คุณต้องการไวยากรณ์พิเศษเพื่อนำเข้าไฟล์ที่มีขีดกลาง
  2. ไม่มีใครคาดว่าชื่อโมดูลที่มีเส้นประ
  3. ขัดกับคำแนะนำของPython Style Guide

หากคุณต้องการนำเข้าชื่อไฟล์ด้วยเส้นประแน่นอนไวยากรณ์พิเศษคือ:

module_name = __import__('module-name')

อยากรู้ว่าทำไมเราต้องมีรูปแบบพิเศษ?

เหตุผลสำหรับไวยากรณ์พิเศษคือเมื่อคุณเขียนimport somenameคุณกำลังสร้างวัตถุโมดูลที่มีตัวระบุsomename(เพื่อให้คุณสามารถใช้ในภายหลังได้เช่นsomename.funcname) แน่นอนmodule-nameไม่ใช่ตัวระบุที่ถูกต้องและด้วยเหตุนี้ไวยากรณ์พิเศษที่ให้ค่าที่ถูกต้อง

คุณไม่เข้าใจว่าทำไมชื่อโมดูลไม่ใช่ตัวระบุที่ถูกต้อง

ไม่ต้องกังวล - ฉันก็ไม่ได้เช่นกัน นี่คือเคล็ดลับที่จะช่วยให้คุณ: x=var1-var2ดูที่บรรทัดหลามนี้: คุณเห็นการลบทางด้านขวาของการมอบหมายหรือชื่อตัวแปรพร้อมกับเครื่องหมายขีดกลางหรือไม่?

PS

ไม่มีอะไรเป็นต้นฉบับในคำตอบของฉันยกเว้นรวมถึงสิ่งที่ฉันถือว่าเป็นบิตของข้อมูลที่เกี่ยวข้องมากที่สุดจากคำตอบอื่น ๆ ทั้งหมดในที่เดียว


ฉันกำลังพยายามใช้การนำเข้าแพคเกจ pip ที่มียัติภังค์อยู่ในนั้น psycopg2_binary = import_module('psycopg2-binary'). ข้อผิดพลาด ModuleNotFoundError: No module named 'psycopg2-binary'=> แต่psycopg2-binaryติดตั้งแล้ว ไม่ทราบวิธีรวมไว้
โมท Zart

อาจเป็นปัญหาของเส้นทาง ดูchrisyeh96.github.io/2017/08/08/…
ndemou

32

ปัญหาคือpython-codeไม่ใช่ตัวระบุ ตัวแยกวิเคราะห์เห็นว่านี่เป็นลบpython codeแน่นอนว่าสิ่งนี้จะไม่ทำในสิ่งที่คุณขอ คุณจะต้องใช้ชื่อไฟล์ที่เป็นตัวระบุ ธ ที่ถูกต้อง ลองแทนที่-ด้วยการขีดเส้นใต้


4
+1 ไม่เคยคิดว่าชื่อไฟล์ของซอร์สโค้ด Python ควรเป็นตัวระบุที่ถูกต้องทำให้ชื่อไฟล์จะถูกใช้เพื่ออ้างถึงวัตถุโมดูล
andy

5

คุณอาจจะสามารถนำเข้ามันผ่านการ__import__แฮ็ก แต่ถ้าคุณยังไม่รู้วิธีการคุณไม่ควรทำ ชื่อโมดูล Python ควรเป็นชื่อตัวแปรที่ถูกต้อง ("ตัวระบุ") - ซึ่งหมายความว่าหากคุณมีโมดูลfoo_barคุณสามารถใช้งานได้จากภายใน Python ( print foo_bar) คุณจะไม่สามารถทำได้ด้วยชื่อแปลก ๆ ( print foo-bar-> ข้อผิดพลาดทางไวยากรณ์)


5

บน Python 3 ให้ใช้import_module :

from importlib import import_module
python_code = import_module('python-code')

ให้เป็นปกติมากกว่านี้,

import_module('package.subpackage.module')

1

แม้ว่าการตั้งชื่อไฟล์ที่เหมาะสมเป็นวิธีที่ดีที่สุดหากpython-codeไม่ได้อยู่ภายใต้การควบคุมของเราการแฮ็คที่ใช้__import__จะดีกว่าการคัดลอกเปลี่ยนชื่อหรือยุ่งเหยิงด้วยรหัสของผู้เขียนคนอื่น อย่างไรก็ตามฉันพยายามแล้ว แต่ก็ใช้งานไม่ได้เว้นแต่ฉันจะเปลี่ยนชื่อไฟล์ที่เพิ่ม.pyส่วนขยาย หลังจากดู เอกสารเพื่อให้ได้คำอธิบาย.pyฉันได้รับสิ่งนี้:

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

มันสร้างไฟล์ใหม่python-codecในการเรียกใช้ครั้งแรก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.