[Python] Stellen Sie sicher, dass die empfangene Funktion eine benutzerdefinierte Funktion ist

Diese Tipps können verwendet werden, wenn Sie eine Bibliothek in Python erstellen und überprüfen möchten, ob die angegebene Funktion wirklich eine vom Benutzer implementierte Funktion ist.

Stellen Sie zunächst fest, ob es sich um eine Funktion handelt

Unnötig zu sagen.

import inspect
inspect.isfunction(func)

Stellen Sie fest, ob es sich um eine integrierte oder eine eingefrorene Funktion handelt

In Python können Sie die in C geschriebenen Funktionen und die in das Python-Verarbeitungssystem integrierten eingefrorenen Funktionen in Form von Bytecode unter den in Python geschriebenen Standardbibliotheken verwenden. Beispielsweise ist "builtins.sorted ()" eine integrierte Funktion und "zipimport.zipimporter ()" eine eingefrorene Funktion.

Wie man sys.modules benutzt

Ich denke, das ist relativ einfach, aber suchen Sie nach dem Modulobjekt mit func, das in sys.modules definiert ist. Wenn das Attribut __file__ nicht vorhanden ist, handelt es sich um eine integrierte Funktion oder eine eingefrorene Funktion. (Mit Ausnahme von integrierten Modulen und eingefrorenen Modulen hat Python immer eine Eins-zu-Eins-Korrespondenz mit Dateien.)

modname = func.__module__
mod = sys.modules[modname]
fname = getattr(mod, '__file__', None)
return fname != None

Verwendung des Code-Objekts

Es gibt die folgenden Methoden wie andere Methoden. Ich denke, das ist prägnanter.

co = getattr(func, '__code__', None)
return co != None

Stellen Sie fest, ob es sich um eine vom Benutzer erstellte Funktion handelt

Ich denke, es gibt verschiedene Möglichkeiten, aber hier, wenn Sie den Pfad der Datei erhalten, in der die Funktion definiert ist und die sich unter dem Modulpfad __main__ (Arbeitsverzeichnis für STDIN) befindet, dann in der vorhandenen Bibliothek Es wird festgestellt, dass die Datei vom Benutzer erstellt wird. Beachten Sie, dass diese Entscheidung möglicherweise nicht mit einem Paketmanager (z. B. "pyflow") funktioniert, der den Bibliothekscache unter das Arbeitsverzeichnis stellt. Es funktioniert möglicherweise auch nicht, wenn Sie beim Ändern des Arbeitsverzeichnisses mit "os.chdir" usw. "importieren". (Ich weiß nicht, ob es so ein Programm gibt)

filename = path.abspath(co.co_filename)
return filename.startswith(path.join(get_maindir(), ''))

def get_maindir():
    mm = sys.modules['__main__']
    fname = getattr(mm, '__file__', None)
    if fname == None:
        # STDIN
        return os.getcwd()
    else:
        return path.dirname(path.abspath(mm.__file__))

Alle Quellcode

import sys
import os
import inspect
from os import path
def is_userfunc_b(func):
    if not inspect.isfunction(func):
        return False
    modname = func.__module__
    mod = sys.modules[modname]
    fname = getattr(mod, '__file__', None)
    if fname == None:
        return false
    fname = path.abspath(fname)
    return fname.startswith(path.join(get_maindir(), ''))
    
def is_userfunc(func):
    if not inspect.isfunction(func):
        return False
    co = getattr(func, '__code__', None)
    if co == None:
        return False
    # Check that the file is placed under main module
    filename = path.abspath(co.co_filename)
    return filename.startswith(path.join(get_maindir(), ''))

def get_maindir():
    mm = sys.modules['__main__']
    fname = getattr(mm, '__file__', None)
    if fname == None:
        # STDIN
        return os.getcwd()
    else:
        return path.dirname(path.abspath(mm.__file__))

Recommended Posts

[Python] Stellen Sie sicher, dass die empfangene Funktion eine benutzerdefinierte Funktion ist
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
[Python] [Meta] Ist der Python-Typ ein Typ?
Holen Sie sich den Aufrufer einer Funktion in Python
Kopieren Sie die Liste in Python
Machen Sie einen Funktionsdekorateur
[Python] Smasher hat versucht, den Video-Ladevorgang mithilfe eines Generators zu einer Funktion zu machen
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
[Übung] Erstellen Sie eine Watson-App mit Python! # 2 [Übersetzungsfunktion]
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Was ist Gott? Erstelle einen einfachen Chatbot mit Python
"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.
Was bedeutet das letzte () in einer Funktion in Python?
Erstellen Sie eine Funktion in Python
Was ist die Aktivierungsfunktion?
Über die Aufzählungsfunktion (Python)
Erstellen Sie ein Lesezeichen in Python
Machen Sie eine Lotterie mit Python
Was ist eine Rückruffunktion?
Was ist die Rückruffunktion?
Das Bild ist Namekuji
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
[Python] Vereinfachen Sie die Formatierungsfunktion (Was ist ein F-String? Erläutern Sie den Unterschied zur Formatierungsfunktion anhand eines Beispiels.)
Spielen Sie Sounds in Python ab, vorausgesetzt, die Tastatur ist eine Klaviertastatur
So überprüfen Sie, ob sich der angegebene Schlüssel im angegebenen Bucket in Boto 3 befindet
"Cython" -Tutorial, um Python explosiv zu machen: Wenn eine Funktion auf der C ++ - Seite überlastet ist.
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Lassen Sie uns eine GUI mit Python erstellen.
[Python] Was ist @? (Über Dekorateure)
[Python] Ausführungszeit, wenn eine Funktion in einen Wörterbuchwert eingegeben wird
Löschen Sie ein bestimmtes Zeichen in Python, wenn es das letzte ist
So erstellen Sie eine rekursive Funktion
[Python] Was ist der sortierte Schlüssel?
Python / Machen Sie ein Diktat aus einer Liste.
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Ich habe eine Funktion erstellt, um zu überprüfen, ob der Webhook vorerst in Lambda empfangen wird
Wofür ist der Python-Unterstrich (_)?
Lassen Sie uns ein Diagramm mit Python erstellen! !!
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
Endlich ... Erstellen Sie einen Funkcontroller mit Python auf Raspberry Pi 3! (Der Motor bewegt sich, während die Taste gedrückt wird.)
[Python] Was ist ein formales Argument? So stellen Sie den Anfangswert ein
Was ist die XX-Datei im Stammverzeichnis eines beliebten Python-Projekts?
[Einführung in Python] Was ist der Unterschied zwischen einer Liste und einem Taple?
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
Ein Shell-Skript, um sich wieder an die pipenv-Shell zu erinnern
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
[Python] Hinweis: Selbst erstellte Funktion zum Ermitteln des Bereichs der Normalverteilung
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Machen Sie die Python-Konsole mit UNKO bedeckt
Erstellen Sie mit Class einen Python-Funktionsdekorator
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Vorsichtsmaßnahmen beim Beizen einer Funktion in Python
[Python] Wie man eine Klasse iterierbar macht