簡體   English   中英

Python 模塊使用前導下划線導入自身,但沒有對應的 .py 文件

[英]Python module importing itself with leading underscore but there is no corresponding .py file

在 PyBluez 源代碼中,我注意到了一些我以前從未見過的東西。 這個名為 widcomm.py 的文件以以下內容開頭:

from .btcommon import *
import socket
import struct
import threading
import os
import _widcomm

在上一個目錄中,沒有 _widcomm.py 或另一個 widcomm.py。 我讀過帶有前導下划線的模塊可能是“私有的”或加速的,但我找不到任何關於似乎用下划線導入自身的模塊的任何信息。

下面幾行你會得到這個有趣的功能:

def dbg (*args):
    return
    sys.stdout.write (*args)
    sys.stdout.write ("\n")

我認為return的代碼永遠無法執行,這是否正確? 據我所知,這個功能毫無用處。

這里到底發生了什么?

關於晦澀的退貨聲明。

您可以在鏈接的 github 上按下責備按鈕,您將在此處看到以下評論:

禁止調試消息

在該返回下方,有將參數打印到標准輸出的調試消息。 所以返回是為了不執行返回之前的那些消息。 就像您猜到的那樣,@mkrieger1 評論說,只要返回到位,這些語句就永遠不會執行。

根據這個 Python 包的安裝文件,

ext_modules.append(Extension('bluetooth._widcomm',
        include_dirs=["%s\\Inc" % WC_BASE],
        define_macros=[('_BTWLIB', None)],
        library_dirs=["%s\\Release" % WC_BASE],
        libraries=["WidcommSdklib", "ws2_32", "version", "user32",
                   "Advapi32", "Winspool", "ole32", "oleaut32"],
        sources=["widcomm\\_widcomm.cpp",
                 "widcomm\\inquirer.cpp",
                 "widcomm\\rfcommport.cpp",
                 "widcomm\\rfcommif.cpp",
                 "widcomm\\l2capconn.cpp",
                 "widcomm\\l2capif.cpp",
                 "widcomm\\sdpservice.cpp",
                 "widcomm\\util.cpp"]))

_widcomm導入是指從_widcomm.cpp和相關 C++ 源文件構建的擴展模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM