September 19, 2026

Python and Poetry: 4 tools for keeping Python simple

More

  • News
  • Features
  • Blogs
  • Fireposts
  • Events
  • Videos
  • Enterprise Buyer’s Guides
  • Package Python apps for easy delivery as executables, dig into Python 3.14’s new debugging interface, and get live coding help for making sense of datasets. Want extra credit? Try wrangling Python projects the Poetry way.

    Serdar Yegulalp

    Serdar Yegulalp is a senior writer at InfoWorld. A veteran technology journalist, Serdar has been writing about computers, operating systems, databases, programming, and other information technology topics for 30 years. Before joining InfoWorld in 2013, Serdar wrote for Windows Magazine, InformationWeek, Byte, and a slew of other publications. At InfoWorld, Serdar has covered software development, devops, containerization, machine learning, and artificial intelligence, winning several B2B journalism awards including a 2024 Neal Award and a 2025 Azbee Award for best instructional content and best how-to article, respectively. He currently focuses on software development tools and technologies and major programming languages including Python, Rust, Go, Zig, and Wasm. Tune into his weekly Dev with serdar videos for programming tips and techniques and close looks at programming libraries and tools.

    More from this author

    Show me more

`,
cio: `

🚀 The new CIO.com hybrid search: 🔍 Explore CIO content smarter, faster and AI powered. ✨

`, nww:`

🚀 The new NetworkWorld.com hybrid search: 🔍 Explore NetworkWorld content smarter, faster and AI powered. ✨

`,
cw: `

🚀 The new Computerworld.com hybrid search: 🔍 Explore Computerworld content smarter, faster and AI powered. ✨

`,
cso: `

🚀 The new CSOonline.com hybrid search: 🔍 Explore CSO content smarter, faster and AI powered. ✨

`
};

const sharedStyles = `

`;

const publisher = foundry_get_publisher();
const htmlContent = contentSwitch[publisher];

if (!htmlContent || !document.body) return;

document.body.insertAdjacentHTML(“afterbegin”, htmlContent + sharedStyles);
const bar = document.querySelector(“.section-block–announcementbar”);

if (bar) {
requestAnimationFrame(() => {
bar.classList.add(“section-block–announcementbar–visible”);
});
}

const btn = document.querySelector(“.section-block–announcementbar .reset-button”);
const searchIcon = document.querySelector(‘.header__icon-button[data-menu-trigger=”search”] svg’);
const searchTrigger = document.querySelector(‘[data-menu-trigger=”search”]’);

if (searchIcon) {
searchIcon.innerHTML = ‘‘;
}

if (btn && searchTrigger) {
btn.addEventListener(“click”, () => searchTrigger.click());
}

console.log(“[MISO SCRIPT] Conditions met, initializing Miso search announcements.”);
};

initMisoSearchAnnouncements();
});

document.addEventListener(‘consentManagerReady’, () => {
const hasConsentYouTube = consentManager.checkConsentByVendors([
‘YouTube’,
‘YT’
]);

if (hasConsentYouTube.some(vendor => vendor[‘Has Consent’] === false)) {
console.log(‘[YOUTUBE SCRIPT] Consent not given for YouTube.’);
} else {
console.log(‘[YOUTUBE SCRIPT] Consent given for YouTube. Loading script…’);
}
});

document.addEventListener(‘consentManagerReady’, () => {
const hasConsentGAM = consentManager.checkConsentByVendors([
‘Google Ad Manager’,
‘GAM’
]);

if (hasConsentGAM.some(vendor => vendor[‘Has Consent’] === false)) {
console.log(‘[GAM SCRIPT] Consent not given for GAM.’);
} else {
console.log(‘[GAM SCRIPT] Consent given for GAM. Loading script…’);
}
});

document.addEventListener(‘consentManagerReady’, () => {
const hasConsentGoogleFonts = consentManager.checkConsentByVendors([
‘Google Fonts’,
‘Google Web Fonts’
]);

if (hasConsentGoogleFonts.some(vendor => vendor[‘Has Consent’] === false)) {
console.log(‘[GOOGLE FONTS SCRIPT] Consent not given for Google Fonts.’);
} else {
console.log(‘[GOOGLE FONTS SCRIPT] Consent given for Google Fonts. Loading script…’);
}
});

document.addEventListener(‘consentManagerReady’, () => {
const hasConsentAdobeTypekit = consentManager.checkConsentByVendors([
‘Adobe Typekit’
]);

if (hasConsentAdobeTypekit.every(vendor => vendor[‘Has Consent’] === true)) {
if (foundry_is_edition(‘kr’)) {
const link = document.createElement(‘link’);
link.rel=”stylesheet”;
link.href=”https://use.typekit.net/ysx4dcu.css”;
document.head.appendChild(link);
}
}
});

(function(){
document.addEventListener(‘consentManagerReady’, () => {
const key = ‘s1gr1xsv4j’;
const debug = consentManager.debug;
if ( ! (key && key.length > 3)){
console.warn(‘[MS Clarity] is enabled but key is too short key=’ + key);
return;
}

const hasConsent = consentManager.checkConsentByVendor(‘Microsoft Clarity’);
if (debug) console.log(‘[MS CLARITY] hasConsent=”,hasConsent );
if(hasConsent){
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
t=l.createElement(r);t.async=1;t.src=”https://www.clarity.ms/tag/”+i;
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window, document, “clarity”, “script”, key);

if (debug) console.log(“[MS CLARITY] checkClarityLoaded allowCookies= typeof window.clarity=’, (typeof window.clarity) );
window.clarity(“consent”);
}
});
})();

document.addEventListener(‘consentManagerReady’, () => {
const vendors = [‘Subscribers’];
const hasConsentSubscribers = consentManager.checkConsentByVendors(vendors);

if (hasConsentSubscribers.some(vendor => vendor[‘Has Consent’] === false)) {
return;

} else {

if (foundry_is_language(‘en’)) {
console.log(‘Language is English’);
// subscribers english ..
}

if (foundry_is_edition(‘kr’)) {
console.log(‘Edition is Korean’);
// subscribers in korean ..
}

if (foundry_is_edition(‘ja’)) {
console.log(‘Edition is Japanese’);
// subscribers in japanese ..
}

}
});

TNG – Latest News & Reviews