การนำเข้าโมดูลตามเงื่อนไขใน Python


143

ในโปรแกรมของฉันฉันต้องการนำเข้า simplejson หรือ json โดยขึ้นอยู่กับว่าระบบปฏิบัติการที่ผู้ใช้ใช้อยู่นั้นเป็น Windows หรือ Linux ฉันใช้ชื่อระบบปฏิบัติการเป็นข้อมูลป้อนเข้าจากผู้ใช้ ตอนนี้การดำเนินการต่อไปนี้ถูกต้องหรือไม่?

osys = raw_input("Press w for windows,l for linux")
if (osys == "w"):
    import json as simplejson
else:
    import simplejson  

33
เหตุใดคุณจึงใช้ชื่อระบบปฏิบัติการเป็นอินพุตจากผู้ใช้ มองเข้าไปในโมดูลแพลตฟอร์ม docs.python.org/library/platform.html platform.platform()หรือplatform.system()ควรทำในสิ่งที่คุณต้องการแทนที่จะให้ผู้ใช้ป้อนข้อมูลทุกครั้งที่เรียกใช้โค้ด
Joe Kington

57
@ S.Lott: เอาจริงดิ? คุณรู้หรือไม่ว่าการโหวตขึ้น / ลงมีขึ้นเพื่อสะท้อนคุณภาพของคำถามใช่ไหม? และไม่ใช่ว่าคุณเห็นด้วยกับอย่างอื่นในรหัสของ OP หรือไม่
ม.ค.

2
@jalf: เป็นคำถามที่ไม่ดีในทุกๆด้านยกเว้นไวยากรณ์ ไม่ควรพบว่าเป็นการตอบสนองสูงสุดสำหรับการค้นหาทุกประเภท
ล็อต

12
@ S.Lott ไม่มีอะไรผิดปกติกับการต้องการทราบว่าการนำเข้าแบบมีเงื่อนไขเป็น pythonic หรือไม่ และเห็นได้ชัดว่าคนอื่น ๆ เห็นด้วยเนื่องจากมีคะแนนโหวต +50 ถึงแม้ว่าคุณจะพยายามก็ตาม
SARose

หลักการที่เกี่ยวข้อง: stackoverflow.com/questions/11360858/…
Brandon Bertelsen

คำตอบ:


186

ฉันเคยเห็นสำนวนนี้ใช้บ่อยมากดังนั้นคุณไม่จำเป็นต้องทำการดมกลิ่น:

try:
    import json
except ImportError:
    import simplejson as json

18
ก่อนอื่นคุณควรลองนำเข้าsimplejson as jsonเนื่องจากน่าจะเป็นรุ่นที่ใหม่กว่า (เร็วกว่า) ของjsonโมดูลมาตรฐาน
Seppo Erviälä

หรือujsonเพื่อความเร็ว
lababidi

61

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

serial/__init__.py

import sys

if sys.platform == 'cli':
    from serial.serialcli import Serial
else:
    import os
    # chose an implementation, depending on os
    if os.name == 'nt':  # sys.platform == 'win32':
        from serial.serialwin32 import Serial
    elif os.name == 'posix':
        from serial.serialposix import Serial, PosixPollSerial, VTIMESerial  # noqa
    elif os.name == 'java':
        from serial.serialjava import Serial
    else:
        raise ImportError(
            "Sorry: no implementation for your platform ('{}') available".format(
                os.name
            )
        )

นี้ควรจะใช้เฉพาะในกรณีที่คุณกำลังสมมติและจำเป็นต้องมีการรับประกันที่แข็งแกร่งที่อินเตอร์เฟซบาง / คุณสมบัติจะมี: เช่น 'ไฟล์' /dev/ttyXที่เรียกว่า ในกรณีของคุณ: การจัดการกับ JSON ไม่มีอะไรที่เป็นระบบปฏิบัติการเฉพาะและคุณกำลังตรวจสอบว่ามีแพ็คเกจอยู่หรือไม่เท่านั้น ในกรณีนั้นเพียงแค่tryนำเข้าและถอยกลับด้วยexceptif ล้มเหลว:

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
ไม่มันไม่ถูกต้องมากที่จะใช้ฮาร์ดโค้ดชื่อ OS ในการตัดสินใจว่าพร้อมใช้งานsimplejsonหรือjsonไม่ คุณกำลังอ้างรหัสจากการนำเข้าเฉพาะระบบปฏิบัติการซึ่งเป็นกรณีที่แตกต่างกันมาก ดูคำตอบของ Matt สำหรับแนวทางที่ถูกต้อง
Glenn Maynard

17
@ เกลนน์เมย์นาร์ด: ตอนนั้นฉันจะรอคุณ; ฉันไม่เคยใช้jsonแพ็กเกจนี้และพยายามตอบคำถาม "คุณสามารถนำเข้าโมดูลตามเงื่อนไข" ให้กว้างขึ้น
Nick T

7

ไม่แนะนำให้ใช้เพื่อผูก json หรือ simplejson กับแพลตฟอร์ม OS simplejson เป็น json เวอร์ชันใหม่และขั้นสูงดังนั้นเราควรลองนำเข้าก่อน

ตามเวอร์ชัน python คุณสามารถลองใช้วิธีการนำเข้า json หรือ simplejson ด้านล่าง

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.