이 글은 Python에서 함수를 동적으로 정의하는 방법을 소개합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
MIT 라이선스에 따라
Python에는 런타임 시 함수 정의를 단순화하는 구문 설탕이 없습니다. 그러나 이것이 달성하기 불가능하거나 어렵다는 것을 의미하지는 않습니다.
from types import FunctionType foo_code = compile('def foo(): return "bar"', "<string>", "exec") foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo") print(foo_func())</string>
출력:
bar
Analytic
코드를 한 줄씩 살펴보면 언어/통역사 장벽이 얼마나 취약한지 알 수 있습니다.
>>> from types import FunctionType
Python 문서에는 일반적으로 수동으로 생성된 클래스용이 아닌 기능이 나열되어 있지 않습니다(이는 완전히 합리적입니다). 이 문제를 해결하는 방법에는 help(), 검사(내장 메서드를 검사할 수 없음), 그리고 CPython 소스 코드를 검사하는 최종 솔루션의 세 가지 방법이 있습니다. (권장: python tutorial)
이 경우 help()와 검사가 모두 작업을 수행하지만 실제 소스 코드를 보면 데이터 유형에 대한 자세한 내용을 확인할 수 있습니다.
>>> from inspect import signature >>> signature(FunctionType) <signature></signature>
1. Code
는 내부적으로 외부 세계에 type.CodeType으로 공개되는 PyCode객체입니다. 내장되지 않은 메소드에는 해당 코드 객체를 저장하는 __code__ 속성이 있습니다. Types.CodeType 객체는 내장된 compile() 메서드를 사용하여 런타임에 생성될 수 있습니다.
2. globals
함수가 로컬에서 정의되지 않았지만 매개변수로 전달되거나 기본 매개변수 값으로 제공되거나 클로저 컨텍스트를 통해 제공되는 변수를 참조하는 경우 전역 사전에서 조회됩니다. .
내장된 globals() 메서드는 현재 모듈의 전역 기호 테이블에 대한 참조를 반환하므로 현재 테이블의 상태와 항상 일치하는 사전을 제공하는 데 사용할 수 있습니다. 다른 사전(FunctionType((lambda: bar).__code__, {"bar" : "baz"}, "foo")() == "baz")을 전달할 수도 있습니다.
3. name(선택 사항)
반환된 함수의 __name__ 속성을 제어합니다. 람다(보통 익명성으로 인해 이름이 없음) 및 이름 바꾸기 함수에만 정말 유용합니다.
4.argdefs(선택 사항)
모든 유형의 객체를 포함하는 튜플을 전달하여 기본 인수 값(def foo(bar="baz"))을 제공하는 방법을 제공합니다. (FunctionType((lambda bar: bar).__code__, {}, "foo", (10,))() == 10).
5. 클로저(선택 사항)
(CPython(PyPy, Jython 등)이 아닌 Python VM에서 실행해야 하는 경우 구현 세부 사항에 크게 의존하므로 건드리지 말아야 합니다).
셀 객체의 튜플. 셀 객체를 생성하는 것은 CPython의 내부 구성 요소에 대한 호출이 필요하기 때문에 완전히 간단하지는 않지만 이를 더 쉽게 만들어 주는 라이브러리가 있습니다: exalt(부끄러운 광고). (주석: 이 라이브러리는 저자가 개발했습니다.)
>>> foo_code = compile('def foo(): return "bar"', "<string>", "exec")</string>
compile()은 내장 메서드이므로 문서화도 잘 되어 있습니다.
exec 모드는 함수를 정의하려면 여러 문이 필요하기 때문에 사용됩니다.
>>> foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo")
모든 것을 집계하고 동적으로 생성된 함수를 변수에 할당합니다.
이전 코드 문장으로 컴파일된 함수는 생성된 코드 객체의 첫 번째 상수가 되므로 foo_code를 가리키는 것만으로는 충분하지 않습니다. 이는 생성된 코드 객체가 여러 상수를 포함할 수 있으므로 exec 모드의 직접적인 결과입니다.
>>> print(foo_func())
동적으로 생성된 함수는 다른 함수처럼 호출할 수 있습니다.
마지막으로
실험을 제외하면 동적으로 생성된 함수가 필요한 시나리오는 거의 없습니다.
Python의 내부를 살펴보는 것은 언어에 대해 더 많이 배울 수 있는 좋은 방법입니다.
원하는 경우 통역사/언어 경계를 쉽게 넘나들 수 있습니다.
위 내용은 Python에서 함수를 동적으로 정의하는 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Arraysinpython, 특히 비밀 복구를위한 ArecrucialInscientificcomputing.1) theaRearedFornumericalOperations, DataAnalysis 및 MachinELearning.2) Numpy'SimplementationIncensuressuressurations thanpythonlists.3) arraysenablequick

Pyenv, Venv 및 Anaconda를 사용하여 다양한 Python 버전을 관리 할 수 있습니다. 1) PYENV를 사용하여 여러 Python 버전을 관리합니다. Pyenv를 설치하고 글로벌 및 로컬 버전을 설정하십시오. 2) VENV를 사용하여 프로젝트 종속성을 분리하기 위해 가상 환경을 만듭니다. 3) Anaconda를 사용하여 데이터 과학 프로젝트에서 Python 버전을 관리하십시오. 4) 시스템 수준의 작업을 위해 시스템 파이썬을 유지하십시오. 이러한 도구와 전략을 통해 다양한 버전의 Python을 효과적으로 관리하여 프로젝트의 원활한 실행을 보장 할 수 있습니다.

Numpyarrayshaveseveraladvantagesstandardpythonarrays : 1) thearemuchfasterduetoc 기반 간증, 2) thearemorememory-refficient, 특히 withlargedatasets 및 3) wepferoptizedformationsformationstaticaloperations, 만들기, 만들기

어레이의 균질성이 성능에 미치는 영향은 이중입니다. 1) 균질성은 컴파일러가 메모리 액세스를 최적화하고 성능을 향상시킬 수 있습니다. 2) 그러나 유형 다양성을 제한하여 비 효율성으로 이어질 수 있습니다. 요컨대, 올바른 데이터 구조를 선택하는 것이 중요합니다.

tocraftexecutablepythonscripts, 다음과 같은 비스트 프랙티스를 따르십시오 : 1) 1) addashebangline (#!/usr/bin/envpython3) tomakethescriptexecutable.2) setpermissionswithchmod xyour_script.py.3) organtionewithlarstringanduseifname == "__"

numpyarraysarebetterfornumericaloperations 및 multi-dimensionaldata, mumemer-efficientArrays

numpyarraysarebetterforheavynumericalcomputing, whilearraymoduleisiMoresuily-sportainedprojectswithsimpledatatypes.1) numpyarraysofferversatively 및 formanceforgedatasets 및 complexoperations.2) Thearraymoduleisweighit 및 ep

ctypesallowscreatingandmanipulatingC-stylearraysinPython.1)UsectypestointerfacewithClibrariesforperformance.2)CreateC-stylearraysfornumericalcomputations.3)PassarraystoCfunctionsforefficientoperations.However,becautiousofmemorymanagement,performanceo


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
